接続文字列のヌル参照をチェックできなかったのはなぜですか?
-
19-09-2019 - |
質問
おそらくC#noobの質問なので、私を炎上させないでください。私はこれをやろうとしていました:
if (ConfigurationManager.ConnectionStrings["PrimaryConnectionString"].ConnectionString != null)
{
// ...
}
しかし、私は取得し続けました System.NullReferenceException
. 。私はそれが私がただチェックできる文字列を返すので思った null
そして先に進みます。それを行うための正しい方法を見つけるのに時間がかかりました:
ConnectionStringSettings cs = ConfigurationManager.ConnectionStrings["PrimaryConnectionString"];
if (cs != null)
{
this.Connection.ConnectionString = cs.ConnectionString;
}
したがって、他の例では、aをチェックするなど Session
ある程度の価値のためのオブジェクト私はチェックをします null
このような:
if (Session["EmployeeID"] != null)
{
_EmployeeID = System.Convert.ToInt32(Session["EmployeeID"]);
}
だから私はあなたがいつあなたがいつできるか、いつできないかをどのように知りたかったのです null
?
解決
null参照例外は、親オブジェクト(configurationmanager.connectionstrings ["primaryconnectionstring"])で発生しました。あなたもそれをチェックすると、あなたは大丈夫です。
これを試して:
if ((ConfigurationManager.ConnectionStrings["PrimaryConnectionString"] != null)
&& (ConfigurationManager.ConnectionStrings["PrimaryConnectionString"].ConnectionString != null))
{ etc etc }
そこからより多くの方法を使用する場合、これらのチェックを分離すると便利であることに注意してください。
他のヒント
あなたの問題は、あなたがチェックしていたことでした:
ConfigurationManager
.ConnectionStrings["PrimaryConnectionString"]
.ConnectionString
ヌルポインターの場合。
実際には、
ConfigurationManager
.ConnectionStrings["PrimaryConnectionString"]
あなたが避難しようとしたとき、ヌルだった それ 接続文字列を取得するには、例外が得られたときです。事実上、あなたがしていることは次のとおりです。
null.ConnectionString
これには問題があります。
私は、単一のステートメントで多くの解釈の層を避けるか、任意の時点で問題をキャッチするために全体の周りに例外ハンドラーを配置する傾向があります。
最初のテストは、接続文字列かどうかを確認します 内部 ConnectionStringsettingsはnullです。 2番目のテストでは、ConnectionStringsettingsの参照自体がnullであるかどうかを確認します。それは次の違いです:
if (person.Name == null)
と
if (person == null)
最初はバングになります person
無効です; 2番目の場合はIFを見つけません person.Name
無効です。両方を確認したい場合は、次のことが必要です。
if (person == null || person.Name == null)
一部の言語(Groovyなど)には、ヌルセーフの控えめなオペレーターがあるので、できます。
var x = Expr1?.Expr2?.Expr3?.Expr4;
これにより、この種のテストが簡単になります。テストしたい場合は どれか 潜在的に長い表現の一部はヌルです。残念ながら、C#はそれを持っていません:(
それで、私はあなたがいつnullをチェックできるかできないかをどのように知りたかったのですか?
君は できる 好きなときはいつでもnullをチェックします(nullではない場合は、nullではありません)。
君は したほうがいい オブジェクトのメンバーにアクセスしたいときはいつでもnullを確認すると、オブジェクトを含む変数がnullでないことがわかりません。
nullチェックの典型的な場所のいくつかは次のとおりです。
- あなたが書いている関数のパラメーターとしてあなたに渡されたオブジェクトを取得します。使用する前に、パラメーターをnull-checkします。
- 使用したいオブジェクトを返すメソッド(またはプロパティ値を取得する)を呼び出します。使用する前に、その返品値をnull-checkします。
- オブジェクトは、スローすることが文書化されている方法に渡します
NullReferenceException
パラメーターがnullの場合。メソッドを呼び出す前に、渡したい変数をnullチェックします。