C#での短絡ステートメントに関する簡単な質問です。次のようなifステートメントを使用します。
if (MyObject.MyArray.Count == 0 || MyObject.MyArray[0].SomeValue == 0)
{
//....
}
「MyArray.Count」の部分が真の場合、評価が停止することは保証されていますか?そうしないと、2番目の部分でnull例外が発生します。
C#での短絡ステートメントに関する簡単な質問です。次のようなifステートメントを使用します。
if (MyObject.MyArray.Count == 0 || MyObject.MyArray[0].SomeValue == 0)
{
//....
}
「MyArray.Count」の部分が真の場合、評価が停止することは保証されていますか?そうしないと、2番目の部分でnull例外が発生します。
はい、これは保証されています。
&&
and||
演算子は、条件付き論理演算子と呼ばれます。これらは「短絡」論理演算子とも呼ばれます。
したがって、それらは定義上論理的な短絡をサポートします-あなたはこの振る舞いに頼ることができます。
ここで、条件演算子と論理演算子を区別することが重要です。
|
であり、論理ANDは&
です。はい、保証されています。
http://msdn.microsoft.com/en-us/library/6373h346%28v=VS.80%29.aspx
条件付きOR演算子(||)は、boolオペランドの論理ORを実行しますが、必要な場合にのみ2番目のオペランドを評価します。
はい、保証されていますが、MyArrayがnull(または明らかにMyObject)の場合でも、null参照例外を取得できます。
ほんの少しの観察。
あなたはこれを言いました:
そうしないと、2番目の部分でnull例外が発生します。(私の強調)
実際、これは真実ではありません。短絡が保証されていない場合IndexOutOfRangeException
は、2番目の部分で取得することができます。
オブジェクトの最初の項目が実際にnullである場合(またはその式の他のオブジェクトのいずれかがnullである場合)、を取得できる可能性があります。NullReferenceException
MyArray
唯一の完全に安全なチェックはこれです:
bool conditionHolds =
MyObject == null ||
MyObject.MyArray == null ||
MyObject.MyArray.Count == 0 ||
MyObject.MyArray[0] == null ||
MyObject.MyArray[0].SomeValue == 0;
if (conditionHolds)
{
//....
}
ネガティブ(エラーにアイテムが含まれていない)ではなく、ポジティブ(配列にアイテムが含まれている)をテストするため、&&演算子を使用することをお勧めします。
if (MyObject.MyArray.Count > 0 && MyObject.MyArray[0].SomeValue == 0)
{
//....
}
これも短絡することが保証されています。