MyObjがnullであると想定します。これを書いても大丈夫ですか?
if(myObj != null && myObj.SomeString != null)
&&は2番目の部分が実行される前にfalseと評価されるため、一部の言語は2番目の式を実行しないことを知っています。
はい。 C#では、_&&
_と_||
_は短絡であるため、左側で結果がまだ決定されていない場合にのみ右側を評価します。一方、演算子_&
_および_|
_は短絡せず、常に両側を評価します。
スペックは言う:
_
&&
_および_||
_演算子は、条件付き論理演算子と呼ばれます。これらは「短絡」論理演算子とも呼ばれます。
...
操作_x && y
_は、操作_x & y
_に対応します。ただし、y
は、x
がtrue
の場合にのみ評価されます
...
操作_x && y
_は_(bool)x ? (bool)y : false
_として評価されます。つまり、x
が最初に評価され、bool
型に変換されます。次に、x
がtrue
である場合、y
が評価されて型bool
に変換され、これが演算の結果になります。それ以外の場合、演算の結果はfalse
です。
(C#言語仕様バージョン4.0-7.12条件付き論理演算子)
_&&
_と_||
_の興味深いプロパティの1つは、ブール値ではなく、ユーザーが演算子_&
_または_|
_をオーバーロードした型であっても短絡していることです。 true
およびfalse
演算子とともに使用します。
操作_
x && y
_はT.false((T)x) ? (T)x : T.&((T)x, y)
として評価されます。ここで、T.false((T)x)
はT
で宣言された_operator false
_の呼び出しであり、T.&((T)x
、y )は、選択された_operator &
_の呼び出しです。さらに、値(T)xは一度だけ評価されます。つまり、
x
が最初に評価されて型T
に変換され、その結果に対して_operator false
_が呼び出されて、x
が確実にfalse
かどうかが判断されます。
次に、x
が確実にfalse
である場合、演算の結果は、x
に対して以前に計算された型で、T
に変換されます。
それ以外の場合、y
が評価され、選択された演算子_&
_が、x
型に変換されたT
に対して以前に計算された値とy
に対して計算された値に対して呼び出され、操作の結果が生成されます。
(C#言語仕様バージョン4.0-7.12.2ユーザー定義の条件付き論理演算子)
はい、C#は論理短絡を使用します。
C#(および他の一部の.NET言語)はこのように動作しますが、CLRではなく言語のプロパティであることに注意してください。
私はパーティーに遅れていることを知っていますが、C#6.0ではこれも行うことができます。
if(myObj?.SomeString != null)
これは上記と同じです。
以下も参照してください: C#6.0での疑問符とドット演算子の意味?。
コードは安全です-&&および||両方とも短絡しています。両端を評価する非短絡演算子&または|を使用できますが、私は実際には多くの製品コードでそれを確認していません。
確かに、C#では安全です。最初のオペランドがfalseの場合、2番目のオペランドは評価されません。
C#では、&&
および||
は短絡されています。つまり、最初の条件が評価され、残りが無視されます。
VB.NETでは、AndAlso
とOrElse
も短絡されています。
JavaScriptでは、&&
および||
も短絡されています。
私はVB.NETについて言及し、.netの醜い赤毛のステップチャイルドにもクールなものがあることを示しています。
私がjavaScriptについて言及したのは、Web開発を行っている場合は、おそらくjavaScriptも使用する可能性があるためです。
完全に安全です。 C#はそれらの言語の1つです。
はい、C#とほとんどの言語はif文を左から右に計算します。
ちなみにVB6はすべてを計算し、それがnullの場合は例外をスローします...
例は
if(strString != null && strString.Length > 0)
両方が実行された場合、この行はnull例外を引き起こします。
興味深いサイドノート。上記の例は、IsNullorEmptyメソッドよりもかなり高速です。