2011-02-10 12 views
7

は、以下の二つの文条件文差

if (null != obj) 

との両方が好ましいであろうその同じ処理された場合

if (obj != null) 

の間の任意の差はありますか?

+7

バグが!=演算子をオーバーロードすると、それらは異なることがあります。 – CodesInChaos

答えて

7

ここでの違いに設定しない限り、コンパイラは、if (obj = blah)すなわち意図しない割り当てをキャッチしません

if (blah == obj) 

は日から茎最初の形の使用は、生成されたコードです。両者はまったく同じコードを生成しませんが、実際にはこれは2つのステートメントの結果やパフォーマンスに影響しません。

しかし、独自の型を作成し、不等号演算子をオーバーライドして、うまく機能しない場合は、問題になります。オペレータへの最初の引数は、すなわち、nullの場合、この場合

public class TestClass 
{ 
    ... 

    public static bool operator !=(TestClass left, TestClass right) 
    { 
     return !left.Equals(right); 
    } 
} 

はこのことを考えてみましょう。 if (null != obj)の場合は、NullReferenceExceptionでクラッシュします。だから、

を要約する:

  • コードを生成することは異なっている
  • パフォーマンスと最後の結果は、あなたが関与タイプのコードが壊れている場合を除き、同じ
    • でなければなりません

ここで私があなたが求めているのは、Cのコードを見たことです通常は次のようなコードを持っていました:

ここでは、平等チェックに切り替えました。その理由は、古いCコンパイラで書かれたプログラム(最近は、この問題を抱える傾向がある)で頻繁に発生するバグは、それを切り換えて等号の1つを忘れることです。この:

if (obj = null) 

これは、代わりにそれを比較する変数にnullを割り当てます。このバグを解消する最良の方法は、nullに何も割り当てることができないので、それを変えることです。それは変数ではありません。すなわち、これはコンパイルに失敗します:文の

if (null = obj) 
2

いいえ、ありません。それはまったく同じです。

スタイルnull == objは、一般的なタイプのobj = nullが誤って変数にnullを割り当てないようにするために使用されることがありますが、!=を使用する理由はまったくありません。

.NETではtypo obj = nullのために実際にはコンパイルされません。
コンパイラによって、誤って実行することを防ぐことができます。

Yoda conditionは、このコンパイラ機能がない他の言語のものです。

+0

誤って '=='の代わりに '='を使用した場合、コンパイラは警告します。 – LukeH

+0

私はちょうどそれを.NETに追加しようとしていました。 –

+0

objが関係する演算子をオーバーライドすると、それらはまったく同じではありません。結果は異なる可能性があります。 – Massif

4

ありませんが、2番目の方法は、より一般的で、より読みやすい(と私の意見では、より論理的)である

20

最初はヨーダ条件です。それを使用しないでください。

1

これらはまったく同じです。

一部の人々は、この

if (obj = null) // should be obj == null 

しかし、あなたの例では、それだけですので、もちろん、これは、!=オペレータには適用されないようなエラーを回避するために、式の最初の部分としてnullを置くことを好みますスタイルの違い。

+0

とC#で "obj = null"がブール値に評価されないため、if(obj = null)はコンパイルエラーです。 – Massif

0

コンパイル警告レベルが最大

0

第一のタイプは、検証を調整しないようにブール値を渡すことが可能であったC/C++、から来ました。例えば。何もない0は本当だった、とゼロは偽だった:だから

if (x = 5) { } // this was true always and changed x value 
if (x == 5) { } // this was true, if x was equal to 5 

、ヨーダの構文はコンパイラを受け取るために、使用された:

if (5) { } // true 
if (0) { } // false 

は、時にはそれはあなたが1「=」文字を入力するのを忘れた場合の問題を作成しました場合のエラー1 '=' を逃した:

if (5 = x) { } // this was generating compiler error for absent-minded programmers 
if (5 == x) { } // this was true, if x was equal to 5 

C#だから

、条件にのみブール値を許可します

ブール型はどうですか?

if (y = true) { } 
if (y == true) { } 

if(y)だけ書くことができるので、これは役に立たないコードです。 結論:Yodaの構文はC/C++でなくなったので、もう使用する必要はありません。