2011-01-25 18 views
9

私は実際に簡単にデバッグできる再利用可能なコードのベストプラクティスを理解しようとしています。私はまだよく理解していない開発者の間で共通の練習をしてきました。コンストラクタのNullのチェック

public MyConstructor(Object myObject) 
{ 
    if (myObject == null) 
     throw new ArgumentNullException("myObject is null."); 
    _myObject = myObject; 
} 

ほとんどの場合、このチェックは不要です。しかし、私はそれがこのチェックを行う利点が何であるか完全に理解していないからだと思う。とにかくnull参照例外がスローされるようだ?私はおそらく間違っている、本当にそれについてのいくつかの考えを聞きたい。

ありがとうございます。

+0

あなたがやっていることは必須ではありません。オブジェクトを参照する前に、nullではないことを確認することができます。もちろん、オブジェクトが初期化されたときに使用するものを検証することは、非常に有効なアプローチです。 –

+2

@Ramhound - これは、StructureMapなどのDIフレームワークを使用する場合、コンストラクタに渡される内容を直接制御する必要がない場合の一般的なアプローチです。あなたのクラスが 'myObject'なしで無駄であり、これを初期化する唯一の場所であれば、できるだけ早く例外をスローしてそれらについて知ることができます。長時間実行されているWebアプリケーションでは、誰かがオブジェクトを必要とするメソッドを呼び出すまで、問題についてはわからないことがあります。 –

答えて

17

コンパイラには、nullが正当なコンストラクタ引数です。

クラスでmyObjectのnull値を処理できる可能性があります。しかし、それができない場合 - myObjectがnullのときにクラスが中断した場合、コンストラクタをチェックするとfail fastが可能になります。

+0

非常によく説明されています。私は特に「失敗する」という言葉が好きだった。洞察をいただきありがとうございます。 – jsmith

+2

+1うわー、それは素晴らしい論文です。リンクありがとう。 –

1

コンパイラはオブジェクトの値を知らないので、実行時にこれをチェックしてヌル値で呼び出されないようにする必要があります。

これはまた、お使いのソリューションによって異なります。例外をスローする必要はありません。その値をnullにできない場合にのみスローし、nullの場合は例外です。

1

nullをチェックする必要があるかどうかは一般的には言えません。むしろあなたはnull値の変数で生きることができるかどうかに依存します。 Null自体は悪い状態ではありません。変数がnullで、それ以外の変数が許される状況があるかもしれません。

null値を許可するかどうかを判断し、それに応じてコンストラクタを設計するのが適切かどうかを確認してください。

3

nullオブジェクトを渡すことは、多くの場合完全に合法です。このクラスでは、実装者は有効なObjectインスタンスを渡すことなくクラスのインスタンスを作成できないようにしたいので、後でチェックする必要はありませんこれをコンストラクタにできるだけ早く確実に行うのが良い方法です。

0

コンパイラが認識できないため、nullを明示的にチェックする必要がありますが、nullも有効な引数になる可能性があるためです。

0

オブジェクトの構築時に例外がスローされるため、コードのどの部分が原因であるかを簡単にトレースできます。あなたのコードが非ヌルmyobject値を必要とし、あなたは、コンストラクタでそれを検証していない場合は、myObject_を使用し、あなたがそのヌル値を送った人を確認するために戻って手動でトレースする必要がありますとき、NullReferenceExceptionがスローされます。

1

あなたは毎回書くコードを減らすために簡単なThrowIfNull拡張メソッドを実装することができます。 Jon Skeetは彼のblogと参照されているSOの記事hereでこれを説明しました。あなたは次の操作を行うことができます4.0の下で

+0

ブログのリンクは壊れていますが、これは同じ記事です:http://codeblog.jonskeet.uk/2009/12/09/quot-magic-quot-null-argument-testing/comment-page-1/ –

2

あなたの場合:

public ctor(IEnjection ninjaWeapon) 
{ 
    Contract.Requires<ArgumentNullException>(ninjaWeapon != null); 
    this.deadlyWeaponary.Add(ninjaWeapon); 
} 

ます場合は、古いバージョンでは、同じことを行うにはMicrosoft.Contractを参照します。

+1

+1 ninjaWeaponの使用 – ninjasense

関連する問題