3

等値比較子を実装する必要がある場合

public class SampleClass
{
    public int Prop { get; set; }
}

作ろうかな

null == new SampleClass() 

new SampleClass() == null

new SampleClass().Equals(null)

間違い?

そして何について

new SampleClass() != null

それも偽であるべきですか?

更新人々は、この質問の背後にある理由を疑問視しています。!= と == は常に反対であると想定されています。しかし、上記のすべての比較が false になるようにメソッドを実装すると、== 演算子と != 演算子が同じ結果になる場合があります。したがって、!= が true を返すか false を返すかはジレンマです。

4

8 に答える 8

7

それは質問でもありますか?いいえ、nullオブジェクトと等しくなることはありません。

編集:したがって、拡張によりnew SampleClass() != nulltrue. nullのようではありませんNaN。それはかなり明確に定義されています。

于 2009-08-18T19:36:43.963 に答える
4

あなたの例からの null とのすべての等値比較は間違いなく偽でなければなりません。ただし、最後のものも非常に重要です。

new SampleClass() != null

trueこれは、参照変数が初期化されているかどうかを確認する一般的な方法であるため、必ず に評価される必要があります。に評価された場合false、C# 開発者は演算子に特定の種類の動作を期待するため、意図せずに変数をあちこちに再割り当てする可能性があります。もう一つの例:

SampleClass myVar = new SampleClass();

// Various stuff happening here, possibly setting myVar to null

if (myVar != null)
{
    // Programmer go "WTFBBQ?" when he finds this doesn't get executed
    myVar.DoStuff();
}

混乱して、プログラマーはこれを次のように変更します。

if (myVar == null)
{
    myVar = new SampleClass();
}

myVar.DoStuff(); // null reference exception, huh?
于 2009-08-18T19:40:35.890 に答える
2

述べられていることと同様に、次のことに注意してください。

定義済みの参照型等値演算子は次のとおりです。

bool operator ==(object x, object y);
bool operator !=(object x, object y);

そう....

SampleClass a = null;
SampleClass b = null;
  • a == b は真です
  • a != b は false

この質問に対する .NET フレームワークの設計者の発言を読んでください。

null 許容関係演算子が「bool」を返さないのはなぜですか? 「ブール」の代わりに?

詳細については、次を参照してください。

于 2009-08-18T20:03:19.107 に答える
1

あなたの質問を完全に理解しているかどうかはわかりませんが、null は (定義により) 値ではありません。そのような、

null == new SampleClass()

実際には意味がありません (そして、実際には、他の比較はどれも意味がありません)。

質問を言い換えていただけますか?

于 2009-08-18T19:37:24.680 に答える
1

null は、null 以外の参照と等しいと決して比較されるべきではありません。拡張により、あなたの != は true を返す必要があります。これは等式の反対です。

于 2009-08-18T19:43:51.343 に答える
1

他の人が言ったように、null は null を含む他のものと決して等しくなりません。これは、null は値ではなく、値がないためです。

特定の質問については、まだ初期化されていないオブジェクトをインスタンス化しようとしているようで、そのオブジェクトが初期化されているかどうかを判断したいと考えています。私の提案は、オブジェクトが初期化されているかどうかを示すプロパティを含めることです。

于 2009-08-18T19:41:18.980 に答える
0

オブジェクトのインスタンスがある場合、null はなく、すべての等価比較子はこれを尊重する必要があります。

于 2009-08-18T19:41:22.847 に答える
0

これは特に興味深い質問だと思います。私は、どの回答ともまったく同じではないことを理解しています。

最初に注意すべきことは、.NET は他のコンテキストnullと完全に同じではありませんが、それらをモデル化するために使用できるということです。null

たとえば SQL では、1 = null1 <> null両方の returnがあるかもしれません。これは、null が null を含む何とも等しくないという数学的なnull概念に近いためですが、正確には何とも等しくないわけでもありません。null

必要に応じてこれにC# を使用することもできますが、.NETnullでの既定の意味は完全には機能しません。null

どの参照型でも、null には特定の定義済みの意味があり、場合によってはコンテキストによって追加の意味が提供されます。

具体的な意味は、「このタイプのオブジェクトのインスタンスはありません」です。

特定のコンテキストでの追加の意味は、「整数値は、任意の整数に一致するのではなく、実際には null である」、または「そのようなアイテムのコレクションはなく、空のコレクションでもありません」、または「これは最初のそのようなアイテムです。だから前者はいない」など、使い方次第です。(また、「ああ、それは実際にはnullになるはずがなかったので、例外をスローしたほうがよい」という意味になる可能性があります)。

ここで、オブジェクトが null と等しい、または少なくとも null と等しくないことが意味のあるケースを定義する程度まで、これらの追加の意味を多用したいと思うかもしれません。ただし、次の制限があります。

  1. 参照型の値に対して null という特定の定義は、その参照型のインスタンスが存在しないことを意味します。

  2. 与えられた x と y に対してx == y常に反対の結果をもたらすセマンティクスはなくなることはありません。x != y

したがって:

  1. インスタンスが null に等しい型が必要な場合は、値型である必要があります。

  2. x != nullは逆に返す必要がありx == nullます。

さて、.NET 2.0 以降、まさにそれを行うビルトインがあります: Nullable<T>(またはT?C# 構文で)。また、ボクシングに直面しても適切に動作するように、少し追加のサポートがあります (これにより、人間の方法で参照型のように動作するようになります。そのため、追加のサポートがx == nullなければ、true が(object)x == null返されても false が返されるという複雑な問題が発生します。

またNullable<T>、null に対してこの種のわずかに異なるセマンティクスを使用したいほとんどすべてのケースに対処できるケースでもあります。Equals()null を渡すと true を返すメソッド。

于 2011-12-12T14:39:41.657 に答える