3

私のメソッドのほとんどは、関数内の null 引数をチェックしているので、書く代わりに考えました

Debug.Assert(x != null, "x should not be null");

if (x == null)
{
    throw new ArgumentNullException("x");
}

どこでも、静的メソッドを使用して静的クラスを作成して集中化するだけです。

ただし、Debug.Assert がトリガーされると、呼び出し元のメソッドが配置される場所ではなく、静的メソッドで VS がポップアップするという独自の問題があります。

誰かがこのシナリオを処理するためのより良い方法を持っているかどうか、または一般的にこの繰り返しの作業を処理する方法を知りたいですか?

ありがとう!

4

5 に答える 5

2

もう1つのアプローチは、MicrosoftResearchのDataContractsです。

于 2011-11-11T07:51:18.640 に答える
1

とにかく明示的に例外をスローする場合は、 x != null をアサートする意味はほとんどありません。グローバルな例外処理がない限り、デバッグで例外が表示されます。それでも、キャッチされないだけでなく、すべての例外で中断できます。

assert を使用するのは、最も安全なリリース モードのコード パスが例外をスローする以外のことであると判断した場合です。たとえば、関数から早期に戻る、変数をデフォルト値に初期化するなどです。

他の回答で言及されているユーティリティを却下するわけではありませんが、特定のケースで、例外をスローするかアサートすることが適切かどうかを慎重に検討することをお勧めします (これは引数の検証だけに当てはまるわけではありません)。

于 2011-11-11T07:58:36.060 に答える
1

1 つのアプローチは、ソース内のリテラル コンテンツの量を最小限に抑えるために、変数の名前を除くすべてをコードに入れます。

Guard.Check(EGuards.NotNull, "x");

流暢な拡張機能に興味がある場合の別のアプローチ(私はこれが好きでフリップフロップします)。

x.MustNotBeNull();
于 2011-11-11T08:02:36.527 に答える
0

ここで説明されている Enterprise Library Exception Hadling Block も参照してください。その機能の 1 つは集中例外処理です。何よりもオープンソースであるため、独自の実装のパターンとして使用できます。

于 2011-11-11T13:19:01.430 に答える
0

たとえば、Sharp-architectureの Design By Contract を見てください。

于 2011-11-11T08:30:26.710 に答える