2009-02-27 7 views
15

と比較すると、これらの等価です。C#の:ヌル

if (null==myobject) 
{ 
//do something 
} 

if (myobject==null) 
{ 
//do something 
} 

またはそれらが異なるコードが生成されますか?

+10

第1は、依田condtionとして知られています:) –

答えて

41

99%の場合、このコードは同等です。

問題のオブジェクトの型が==演算子をオーバーライドする場合は例外です。 ==にバグが導入される可能性があります。これは、あるパラメータがnullの場合に問題を引き起こします。

私が前に見てきた特定の例

はなく、そうでないときはnull右側で、ヌルが左側にあるとき、これは失敗します以下

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

です。

これは非常に遠いコーナーケースです。

+0

解決策は 'if((object)left == null)'または 'if(ReferenceEquals(left、null))'です。前者はおそらくより演奏的です。 – yfeldblum

+0

@ Justice、JITを調べたことはありませんが、Object.Referenceと同じであれば、C#はメソッド呼び出しを生成します。演算子の不自然さで== C#はIL演算コードceqとの直接値比較を生成します。私の推測では、ceqが高速です。 – JaredPar

+4

@ジャスティスですが、パフォーマンスについて何も想定していないので、プロファイラを信頼してください:) – JaredPar

9

定数を左に置く "if"文の形式は、if文で任意の式を持つことができるC/C++のホールドオーバーです。

ifステートメントのC#の構文では、式がboolに評価される必要があります。つまり、if (foo = 0)はコンパイルされません。

+0

ああ。私は数年前にC#を勉強していた時を思い出していました。私はif文で代入(偶然)を使うときにコンパイラの警告やエラーが出ることを思い出しました。 switch文のbreakが見つからない場合)。 +1 –

+0

私たちはこれを意図的にやって、割り当てをして同時に値をチェックしていました。 C++の代入演算子は、割り当てられた値を返します。私はちょっとその機能が欠けていますが、悪用するのは簡単でした。 – Jasmine

+1

@ジャスミン:時にはコンストラクトも使用します。単に "if((foo = bar())== nullptr)"を実行します。しかし、通常はコードレビューを生き残ることはできません - "foo = bar(); if(foo == nullptr)"に変更され、より洗練されたIMHOです。 –

1

他の人に指摘されているように、ほとんど同じです。 http://en.wikipedia.org/wiki/Null_Object_pattern

それは単純にnull参照をチェックするために非常に有用な代替です:

また見てみる必要があります。

6

if (null==myobject) { 

は、if文を書くの安全な方法です。これはC/C++から来ており、条件は式がintと評価されています。結果が0であればfalse、その他はtrueです。あなたは

if (variable == 1) { 

ような何かを書くことができますが、あなたが気をつけていなかった場合、あなたはまた、あなたが常に1と評価するため、常に真である割り当てを持っている場合には

if (variable = 1) { 

を書くことができます。

これをコンパイルして問題なく実行することができますが、結果は期待した結果とならない可能性があります。だから、C/C++プログラマは、あなたがそれを間違え場合、これはコンパイルされませんので、あなたは常にあなたがそれを書くためのものとしてそれを書かなければならなかった

if (1 == variable) { 

のようなものを書き始めました。これは後で(良い)習慣になり、例えばC#でプログラミングするすべての言語で使用します。あなたは混乱を減らすために探しているなら、それはC-languageスタイルのヌルチェックあなたのC#クラスのために有効にすることも可能ですが、それを逃す人のために

2

、:

class MyObj 
{ 
    public void implicit_null_comparison_demo() 
    { 
     MyObj mo = null; 
     // ... 

     if (mo)   // <-- like so (can also use !mo) 
     { 
      // it's not null... 
     } 
     else 
     { 
      // it's null... 
     } 
    } 

    public static implicit operator bool(MyObj mo) 
    { 
     return (Object)mo != null; 
    } 
};