2 つの条件を持つIf
ステートメントがあり、最初の条件が失敗した場合、2 番目の条件も考慮されelse
ますか? したがって、次の例では、 ifmyList.Count == 0
がmyString
「値」と比較されますか、それとも単純にelse
ですか?
if(myList.Count > 0 && myString.Equals("value"))
{
//Do something
}
else
{
//Do something else
}
2 つの条件を持つIf
ステートメントがあり、最初の条件が失敗した場合、2 番目の条件も考慮されelse
ますか? したがって、次の例では、 ifmyList.Count == 0
がmyString
「値」と比較されますか、それとも単純にelse
ですか?
if(myList.Count > 0 && myString.Equals("value"))
{
//Do something
}
else
{
//Do something else
}
二重アンパサンド && 演算子を使用しているため、評価が停止します。これを短絡と呼びます。
単一のアンパサンドに変更した場合:
if(myList.Count > 0 & myString.Equals("value"))
両方を評価します。
いいえ、考慮されません。(これは短絡として知られています。)
false
コンパイラは、最初の条件がである場合、式が に評価される方法がないことを知るのに十分賢い (そして言語仕様で必要とされる) true
。
Jacob が指摘し||
たように、最初の条件が のtrue
場合、2 番目の条件は評価されません。
論理演算子が AND (&&) の場合、IF ステートメントは最初の式を評価します。最初の式が false の場合、2 番目の式は評価されません。これは、参照でメソッドを呼び出す前に変数が null かどうかを確認するのに役立ちます - null ポインター例外を避けるために
論理演算子が OR (||) の場合、IF ステートメントは最初の式を評価します。最初の式が真の場合、2 番目の式は評価されません。
コンパイラとランタイムは、この動作に合わせて最適化されています
いいえ、を使用すると、2 番目の条件はスキップされます&&
。
使用する場合&
は考慮されます
次のことを考慮してください。
static int? x;
static int? y;
static void Main(string[] args)
{
x = 5;
if (testx() & testy())
{
Console.WriteLine("test");
}
}
static Boolean testx()
{
return x == 3;
}
static Boolean testy()
{
return y == 10;
}
トレースすると、testx が false であっても、testx と testy の両方の関数が評価されます。
テストを && に変更すると、最初のものだけがチェックされます。
あなたの例では、最初のステートメントが失敗した場合にのみ、2 番目のステートメントが評価されます。論理 ANDは、両方のオペランドが true の場合&&
にのみ返されます (短絡評価とも呼ばれます) 。true
.NET はサポートしているshort circuiting
ため、最初の条件が失敗した場合、2 番目の条件はチェックされません....C# では || および && は、論理演算子 | の短絡バージョンです。および & それぞれ....多くの場合、高速すぎます...