2017-06-17 6 views

答えて

4

MSDNドキュメントから:

Is operator チェックオブジェクトは、指定されたタイプと互換性がある、または(C位で始まる7)パターンに対する式をテストしている場合。 isキーワードは、実行時に型の互換性を評価します。オブジェクトインスタンスまたは式の結果を指定した型に変換できるかどうかを判断します。事前定義された値型について

== is そのオペランドの値がそうでない場合、同じ偽である場合には、等価演算子(==)がtrueを返します。 string以外の参照型の場合、==は、2つのオペランドが同じオブジェクトを参照する場合にtrueを返します。文字列型の場合、==は文字列の値を比較します。

要約:いいえ、この例ではありません。 isは通常、typeをチェックする場合に使用します。この場合はnullです。値を確認する場合は==を入力してください。この場合もnullなので、両方ともtrueと評価されます。

+1

そのドキュメントは混乱しています。'=='はオーバーロードされる可能性があります。したがって、ユーザ定義型の場合、必要なものを返すことができます。 – svick

7

ショートバージョン:よく動作するタイプの場合、foo is nullfoo == nullの間に違いはありません。

ロングバージョン:あなたはfoo == nullを書き、operator ==の適切な過負荷が存在するとき、それはいわゆる

です。それ以外の場合は、参照型に参照等価が使用され、値型に値等価が使用されます。

参照タイプにfoo is nullと書くと、これはobject.Equals(null, foo)と書かれたようにコンパイルされます(切り替えられた注文に気付くと違いがあります)。実際には、これはfoonullの間の参照平等の比較を実行します。値の型の場合、foo is nullはコンパイルされません。

これは、あなたがfooのいくつかのインスタンスがnullに等しいと言うクラスwoth operator ==を書く場合は、foo == nullfoo is nullとは異なる結果を与えることを意味します。

using System; 

public class Foo 
{ 
    public static void Main() 
    { 
     var foo = new Foo(); 
     Console.WriteLine(foo == null); 
     Console.WriteLine(foo is null); 
    } 

    public static bool operator ==(Foo foo1, Foo foo2) => true; 
    // operator != has to exist to appease the compiler 
    public static bool operator !=(Foo foo1, Foo foo2) => false; 
} 

このコード出力:これを示す

True 
False 

あなたがoperator ==をオーバーロードするとき、あなたはそれが他のものの間で、あなたを意味し、合理的な方法で動作させる必要があります0123,fooの場合foo == nulltrueであるとは限りません。この副作用として、通常の状況では、foo == nullfoo is nullは同じ値を持ちます。

関連する問題