他の誰もが言っているように、本番環境で不可解な問題が発生するよりも、早い段階で失敗する方がはるかに望ましいのです。あなたの例のように、関数が null 引数を返す場合)。
関数が値を返さずに をスローするだけNullReferenceException
の場合でも、引数が null であることがわかっていると、バグを解決しやすくなります。関数が をスローした場合、NullReferenceException
何が原因でnull
、誰のせいだったのかわかりません。
ArgumentNullException
理由により、パラメーターを取ることを追加したいと思います。
書いたほうがいい
if(myArg == null) throw new ArgumentNullException("myArg");
ArgumentNullException
なしで を投げるよりもparamName
。
このようにして、5 つのパラメーターを受け取る関数から例外が発生した場合、どのパラメーターが問題を引き起こしたかを知ることができます。これは、デバッガーをアタッチできない場合に特に重要です。(たとえば、実稼働 Web サーバーまたはエンドユーザー マシン上)
多くの関数を記述している場合、特に文字列用の IntelliSense がないため、これは多くのオーバーヘッドになる可能性があります。これらのチェックを生成するコード スニペットを作成しました。
<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>Check for null arguments</Title>
<Shortcut>tna</Shortcut>
<Description>Code snippet for throw new ArgumentNullException</Description>
<Author>SLaks</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
<SnippetType>SurroundsWith</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>Parameter</ID>
<ToolTip>Paremeter to check for null</ToolTip>
<Default>value</Default>
</Literal>
</Declarations>
<Code Language="csharp"><![CDATA[if ($Parameter$ == null) throw new ArgumentNullException("$Parameter$");
$end$]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>