web-dev-qa-db-ja.com

コンストラクターでArgumentNullExceptionをスローしますか?

単一のパラメーターを持つコンストラクターの場合、パラメーターがnullまたは空の場合、コンストラクター内でArgumentNullExceptionをスローしても問題ありませんか?または、実際に引数を使用するメソッドでスローする必要がありますか?ありがとう。

52
Ryan Peters

はい、それが完全に不可欠な場合は、例外をスローします。後で例外をスローすることはできません*。

"Fail Early Principle" を常に覚えておいてください。コンセプトが失敗しているため、デバッグに時間を浪費したり、予期しないシステム機能を体験したりする必要はありません。

または、 ""の場合はArgumentExceptionを、nullの場合はArgumentNullExceptionをスローすることもできます。どちらの場合も、有効な例外メッセージをスローするようにしてください。


例外を管理するための常に良い参考記事: 優れた例外管理の経験則


@ Steve Michelottiの発言についての補足説明(CodeContractsの大ファンだからです)

Contract.Requires<ArgumentNullException>(inputParemeter!= null, "inputparameter cannot be null");
Contract.Requires<ArgumentException>(inputParemeter!= "", "inputparameter cannot be empty string");

あるいは

Contract.Requires<ArgumentNullException>(!string.IsNullOrEmpty(inputParemeter), "inputparameter cannot be null or empty string");
53
Nix

コンストラクタでそれを投げることは問題ありません-これを行う.NETフレームワークにはいくつかのクラスがあります。さらに、 コード契約 を確認してください。

17

それがどのように聞こえるかから、パラメーターをコンストラクターに渡して、後で他のメソッドで使用するためにクラスによって保持されるようにします。コンストラクタで実際に引数を使用していない場合は、引数を実際にを使用するメソッドのパラメータに移動することを検討する必要があります。

4
Steve Danner

コンストラクターが呼び出されたときに設定したプロパティにチェックを入れます...そうすれば、すべての場合に例外がスローされます。

1
F.B. ten Kate