ホームページ > バックエンド開発 > C++ > C# Null チェック: `x is null` と `x == null` をいつ使用するか?

C# Null チェック: `x is null` と `x == null` をいつ使用するか?

Barbara Streisand
リリース: 2024-12-30 12:55:09
オリジナル
845 人が閲覧しました

C# Null Checks: When to Use `x is null` vs. `x == null`?

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 is null を使用します。

最終的に、x は null か x = のどちらかを選択します。 = null は、コードの特定の要件によって異なります。

以上がC# Null チェック: `x is null` と `x == null` をいつ使用するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート