65

myObj が null であると仮定します。これを書いても安全ですか?

if(myObj != null && myObj.SomeString != null)

2 番目の部分が実行される前に && が false と評価されるため、一部の言語では 2 番目の式が実行されないことがわかっています。

4

9 に答える 9

93

はい。C# では&&||が短絡しているため、左側で結果が決定されていない場合にのみ右側が評価されます。一方、演算子&|は短絡せず、常に両側を評価します。

仕様には次のように書かれています。

&&and||演算子は、条件付き論理演算子と呼ばれます。これらは、「短絡」論理演算子とも呼ばれます。
...
操作は 操作x && yに対応しますがx & y、が である場合にyのみ評価され ます ... 操作は として評価されます。つまり、が最初に評価され、 type に変換されます。次に、if isが評価され、 typeに変換され、これが演算の結果になります。それ以外の場合、演算の結果は です。xtrue

x && y(bool)x ? (bool)y : falsexboolxtrueyboolfalse

(C# 言語仕様バージョン 4.0 - 7.12 条件付き論理演算子)

&&andの興味深い特性の 1 つは、bool ではなく、ユーザーが演算子をオーバーロードした型、またはand演算子と一緒に||型を操作した場合でも短絡することです。&|truefalse

操作x && yは として評価されますT.false((T)x) ? (T)x : T.&((T)x, y)。ここ で、 は inで宣言されT.false((T)x)た の呼び出し、y) は選択された の呼び出しです。さらに、値 (T)x は 1 回だけ評価されます。operator falseTT.&((T)xoperator &

つまり、x最初に評価されて型に変換さToperator false、結果に対して呼び出されxfalse
次に、xが fullyの場合false、演算の結果は、xtype に変換するために以前に計算された値になりますT
それ以外の場合yは評価され、選択された演算子は、型に変換されたために以前に計算された値と、操作の結果を生成するために計算さ&れた値に対して呼び出されます。xTy

(C# 言語仕様バージョン 4.0 - 7.12.2 ユーザー定義の条件付き論理演算子)

于 2011-01-27T19:02:24.537 に答える
16

はい、C# は論理短絡を使用します。

C# (およびその他の .NET 言語) はこのように動作しますが、これは CLR ではなく言語のプロパティであることに注意してください。

于 2011-01-27T19:02:09.950 に答える
6

私はパーティーに遅れていることを知っていますが、C# 6.0 では次のこともできます。

if(myObj?.SomeString != null)

これは上記と同じです。

また参照してください: 疑問符とドット演算子とは何ですか?. C# 6.0 での意味?

于 2016-01-21T22:55:52.710 に答える
4

あなたのコードは安全です - && と || 両方とも短絡しています。両端を評価する非短絡演算子 & または | を使用できますが、多くの製品コードでは実際には見られません。

于 2011-01-27T19:05:06.010 に答える
3

確かに、C# では安全です。最初のオペランドが false の場合、2 番目のオペランドは評価されません。

于 2011-01-27T19:02:54.433 に答える
1

それは完全に安全です。C# はそれらの言語の 1 つです。

于 2011-01-27T19:02:28.983 に答える
0

はい、C# とほとんどの言語は、if 文を左から右に計算します。

ちなみにVB6は全体を計算し、nullの場合は例外をスローします...

于 2011-01-27T19:03:12.210 に答える
0

例は

if(strString != null && strString.Length > 0)

この行は、両側が実行された場合に null 例外を引き起こします。

興味深い補足。上記の例は、IsNullorEmpty メソッドよりもかなり高速です。

于 2011-01-27T19:30:43.423 に答える