myObj が null であると仮定します。これを書いても安全ですか?
if(myObj != null && myObj.SomeString != null)
2 番目の部分が実行される前に && が false と評価されるため、一部の言語では 2 番目の式が実行されないことがわかっています。
myObj が null であると仮定します。これを書いても安全ですか?
if(myObj != null && myObj.SomeString != null)
2 番目の部分が実行される前に && が false と評価されるため、一部の言語では 2 番目の式が実行されないことがわかっています。
はい。C# では&&
と||
が短絡しているため、左側で結果が決定されていない場合にのみ右側が評価されます。一方、演算子&
と|
は短絡せず、常に両側を評価します。
仕様には次のように書かれています。
&&
and||
演算子は、条件付き論理演算子と呼ばれます。これらは、「短絡」論理演算子とも呼ばれます。
...
操作は 操作x && y
に対応しますがx & y
、が である場合にy
のみ評価され ます ... 操作は として評価されます。つまり、が最初に評価され、 type に変換されます。次に、if isが評価され、 typeに変換され、これが演算の結果になります。それ以外の場合、演算の結果は です。x
true
x && y
(bool)x ? (bool)y : false
x
bool
x
true
y
bool
false
(C# 言語仕様バージョン 4.0 - 7.12 条件付き論理演算子)
&&
andの興味深い特性の 1 つは、bool ではなく、ユーザーが演算子をオーバーロードした型、またはand演算子と一緒に||
型を操作した場合でも短絡することです。&
|
true
false
操作
x && y
は として評価されますT.false((T)x) ? (T)x : T.&((T)x, y)
。ここ で、 は inで宣言されT.false((T)x)
た の呼び出し、y) は選択された の呼び出しです。さらに、値 (T)x は 1 回だけ評価されます。operator false
T
T.&((T)x
operator &
つまり、
x
最初に評価されて型に変換さT
れoperator false
、結果に対して呼び出されx
てfalse
、
次に、x
が fullyの場合false
、演算の結果は、x
type に変換するために以前に計算された値になります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# はそれらの言語の 1 つです。
はい、C# とほとんどの言語は、if 文を左から右に計算します。
ちなみにVB6は全体を計算し、nullの場合は例外をスローします...
例は
if(strString != null && strString.Length > 0)
この行は、両側が実行された場合に null 例外を引き起こします。
興味深い補足。上記の例は、IsNullorEmpty メソッドよりもかなり高速です。