2015-12-11 9 views
5

にチェックすることがヌルなら、私が見てきたはいくつかのコードをレビューするには、左側または右側

if (condition == null) { ... } 

私があることを覚えているようです左側にnullという利点がありますが、思い出せず、新しい.NETランタイムで最適化された古いランタイムアイテムだと思っていました。私は後者のヌルチェックを使う傾向があるので、前者は私の目を捉えます。

これはスタイルの問題ですか、またはnullが評価の左側または右側にあることに利点がありますか?

+3

コンパイラがそれに関する警告を生成する前に、それは古いCバージョンの関連するハックでした。 C#では問題ではありませんが、Cとは違って* bool *型ですので、書くときに叫ぶでしょう。(obj = null){} –

答えて

3

差分を作ることができますeが3例であった。

condition = nullのタイプがifで有効な場所は1つです。これはCスタイルの言語ではnulliffalseと評価されています)(これは大部分ですがC#では使用できません)で可能です。

C#でこの効果を持つ型を作成することが可能である:

public class Test 
{ 
    public static bool operator true(Test x) 
    { 
    return true; 
    } 
    public static bool operator false(Test x) 
    { 
    return false; 
    } 
} 
void Main() 
{ 
    Test test = new test(); 
    if (test = null) 
    { 
    Console.WriteLine("!"); 
    } 
} 

多くの時間は、それがより多くの価値を持っていた、特に(.NET 2.0導入ジェネリックいるので、これらの演算子をオーバーロードすることは意味を成していることはありません例えばbool?のようにtruefalseまたはnullを示す値を有効にしたSqlBooleanのようなタイプの場合は、

だから、このケースはC#ではかなり限界です。

void Main() 
{ 
    Test test = new Test(); 
    if (test = null) 
    { 
    Console.WriteLine("!"); 
    } 
} 
public class Test 
{ 
    public static implicit operator bool(Test x) 
    { 
    return true; 
    } 
} 

暗黙の演算子は、いくつかの理由のために回避する価値があるが、これはわずかです:順番にtruefalse演算子を実装することをboolまたは型への暗黙の変換があるかどう

もう一つは、似ています最初の例よりも可能性が高いですが、まだ一般的ではありません。

さらに別の==が非対称的にオーバーロードされている場合は次のとおりです。

public class Test 
{ 
    public static bool operator == (Test x, Test y) 
    { 
    return ReferenceEquals(x, null); 
    } 
    public static bool operator !=(Test x, Test y) 
    { 
    return !(x == y); 
    } 
} 
void Main() 
{ 
    Test test = new Test(); 
    if (test == null) 
    { 
    Console.WriteLine("This won't print."); 
    } 
    if (null == test) 
    { 
    Console.WriteLine("This will print."); 
    } 
} 

しかし、非対称==は常にバグがあるため、これはどんな効果があるとオペレータのバグに依存します。これはおそらく最初のケースよりも若干頻繁に起こりますが、そうしたときには修正する必要があります。

は、C#で効果を有することができるので、ケースはまれであり、ほとんどが、彼らはいけない何かをした誰かに基づきます。

このように、主にスタイルの問題です。 nullを最初に置く人々は、それがより多くの違いをもたらす言語からそれを取り上げる傾向があります。

+0

詳細な回答ありがとうございます。 +1 –

7

Cスタイルの言語の古典的な理由は、等価性==を間違ってタイプすることを防ぐためです。割り当ては=です。あなたは定数に割り当てることができません - 次は違法である。すなわち、したがって、コンパイラがバグキャッチします:これは完全に法律上の(おそらく作者が意図していない何であるのに対し

if (false = condition) { ... } 

を:

if (condition = false) { ... } 

注:この問題は、ifステートメントでbool(下記のコメントに記載されている)が必要であるため、C#で制限されているため、タイプがboolの場合にのみ問題が発生します。

+0

'C#'では、とにかく 'null'と比較できない(そして' bool? 'は' if'文の中では有効な型ではありません) – Rob

+1

'if'は' bool'を必要とし、 'bool'には' null'を割り当てることができないので、これはC#では合法ではありません。 – juharr

+1

@juharrそれは正当なC#です。なぜなら、 'condition'の型を知らないので、' true'と 'false'演算子に過負荷を与える可能性があるからです。 –

0

かかわらず(null == condition)コンパイル、第一(左)オペランドとしてnullよう例示的値を使用してどのようには反直感的です。代わりに、最初のオペランドはあなたが評価しようとしているものを示唆すべきです。

関連する問題