3

==演算子とをオーバーロードする場合を含め、C# で null を確実にチェックするにはどうすればよい!=ですか?

class MyClass
{
    public static bool operator ==(MyClass a, MyClass b) { return false; }
    public static bool operator !=(MyClass a, MyClass b) { return true; }
}

class Program {
    static void Main(string[] args) {
        MyClass x = new MyClass();
        MyClass y = null;
        if (x != null) { System.Console.WriteLine(x.ToString()); }
        // Next line throws a NullReferenceException
        if (y != null) { System.Console.WriteLine(y.ToString()); }
    }
}

次のオプションが利用可能であることを知っています。

  • x != null演算子をオーバーロードする場合は信頼できません。
  • null != x演算子をオーバーロードする場合は信頼できません。
  • (x ?? null) != null型はまだ でMyClassあるため、演算子をオーバーロードする場合は信頼できません。
  • object.ReferenceEquals(x, null)大丈夫なはず。
  • x.Equals(null)動作しません (もちろん、 でメソッドを呼び出しているためx、これは である可能性がありますnull)
  • object o = x; o != nullを使用する必要objectoperator !=あるため、機能するはずです。
  • 他の何か?

では、信頼性、速度、読みやすさの点でどの方法が最適で、最も慣用的な方法はどれでしょうか? マイクロソフトは、ドキュメント/コーディング標準などで何らかの方法を推奨していますか?

4

2 に答える 2

3

System.Objectの static ReferenceEqualsメソッドを使用できます。

それが技術的に正しい解決策です。ただし、あなたがすべきことは、そのクラスのサプライヤーに、それがバグのあるたわごとであり、それを使用できないことを知らせることです. 他の人のバグを修正するのはあなたの責任ではありません。自分のバグを修正するのに十分な作業です。

于 2013-10-21T10:49:23.263 に答える
2

マイクロソフトは、ドキュメント/コーディング標準などで何らかの方法を推奨していますか?

はい、マイクロソフトはReferenceEqualsnull をチェックする前にオブジェクトにキャストすることをお勧めします。それ以外の場合==は、再帰的に呼び出されます。これはマイクロソフトが言わなければならないことです。

operator == のオーバーロードでよくあるエラーは、(a == b)、(a == null)、または (b == null) を使用して参照の等価性をチェックすることです。これにより、オーバーロードされた演算子 == が呼び出され、無限ループが発生します。ループを回避するには、ReferenceEquals を使用するか、型を Object にキャストします。

オブジェクトにキャストするということは、

if(((object)yourObject) == null)
{}
于 2013-10-21T10:28:46.167 に答える