2つの条件を持つIf
ステートメントがあり、最初の条件が失敗した場合、2番目の条件も考慮されますか、それともelse
に直接進みますか?したがって、次の例では、myList.Count == 0
、myString
は「値」と比較されますか、それともelse
と直接比較されますか?
if(myList.Count > 0 && myString.Equals("value"))
{
//Do something
}
else
{
//Do something else
}
ダブルアンパサンド&&演算子を使用しているため、評価が停止します。これは short-circuiting と呼ばれます。
単一のアンパサンドに変更した場合:
if(myList.Count > 0 & myString.Equals("value"))
両方を評価します。
いいえ、考慮されません。 (これは 短絡 として知られています。)
コンパイラは、最初の条件がfalse
である場合、式がtrue
に評価される方法がないことを知るのに十分な(そして言語仕様で要求される)ものです。
そして、ジェイコブが||
、最初の条件が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がfalseであっても関数が評価されます。
テストを&&に変更すると、最初のチェックのみがチェックされました。
この例では、2番目のステートメントは、最初のステートメントが失敗した場合にのみ評価されます。論理AND &&
は、両方のオペランドがtrueの場合、つまり短絡評価の場合にのみtrue
を返します。
.NETはshort circuiting
したがって、最初の条件が失敗すると、2番目の条件はチェックされません。..C#で||および&&は、論理演算子の短絡バージョンです。そして、それぞれ....それもしばしば高速です...
式は論理AND演算であるため、左から右に評価されます。 falseの場合、評価を停止します。また、式の操作の中で最も優先順位が高くなります。
条件付きAND演算子(&&)は、boolオペランドの論理ANDを実行しますが、必要な場合にのみ2番目のオペランドを評価します。 条件付きAnd演算子(&&) MSDN
以下に、一連の 最高の優先順位から最低のC#演算子をリストするセクション を示します。