C# での Null 参照の比較: "x is null" と "x == null"
C# 7 では、パターン マッチング演算子は、従来の == null 式と比較してその使用法について疑問を引き起こしています。 null を扱う場合、これらの式は交換可能に見えるかもしれませんが、参照型を比較するときに考慮すべき重要な違いがあります。
型に関する考慮事項
オブジェクトを比較する == null とは異なります。等価性の参照、x が null の場合は、x の型をチェックします。 x が参照型の場合、x is null は、x が null の場合にのみ true を返します。対照的に、x == null は、null と null 以外の値を持つ参照型の両方に対して true を返します。
class Foo {} Foo foo = null; Console.WriteLine(foo is null); // True Console.WriteLine(foo == null); // True
パフォーマンスへの影響
内部的には、x は null 呼び出しです。 System.Object.Equals(object, object) の場合、x == null は ceq (参照型の比較メソッド) を呼び出します。 null 参照の場合、どちらの式も true を返すため、パフォーマンスは同じになります。ただし、null 以外の参照の場合、x is null は追加の型チェックにより大幅に遅くなる可能性があります。
オーバーロードされた等価演算子
等価演算子 (例: == または Equals) が特定の型に対してオーバーロードされている場合、x is null は型の等価性をチェックせず、代わりにオーバーロードされた演算子に委譲します。一方、x == null は参照の等価性を常にチェックします。
class Foo { public static bool operator ==(Foo left, Foo right) => ... public static bool operator !=(Foo left, Foo right) => ... } Foo foo1 = new Foo(); Foo foo2 = null; Console.WriteLine(foo1 is null); // False (checks type only) Console.WriteLine(foo1 == null); // False (delegates to overloaded operator) Console.WriteLine(foo2 is null); // True (checks type only) Console.WriteLine(foo2 == null); // True (reference comparison)
一方を他方より使用する場合
一般的には次のとおりです。
最終的に、x は null か x = のどちらかを選択します。 = null は、コードの特定の要件によって異なります。
以上がC# Null チェック: `x is null` と `x == null` をいつ使用するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。