2011-11-11 10 views
2

私が理解するように、Equals()は、指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。Equals()を理解するのに苦労します

だから私は、このプレーヤークラスがある場合:

public class Player 
{ 
    int score; 

    public object Clone() 
    { 
     return this.MemberwiseClone(); 
    } 

    public void SetScore(int i) 
    { 
     this.score = i; 
    } 

    public int GetScore() 
    { 
     return this.score; 
    } 
} 

Antはその後、私はこのような2プレイヤーのインスタンス化:なぜそれは()のように使用された場合はfalseを返すのEqualsを行うこと

Player p1 = new Player(); 
p1.SetScore(7); 
Player p2 = (Player)p1.Clone(); 

です。

Console.WriteLine(p1.Equals(p2)); // prints "False" to console 

どのように等しくないのですか?

答えて

10

Equals関数をオーバーライドしない限り、参照を比較して、と同じオブジェクトであるかどうかを確認しています。

Implementing the Equals Methodを参照してください。

参考になる場合があり、特定のオブジェクトであるかどうかを確認したい場合があります。セイ:

Player myFavorite = new Player(); 
//do stuff... 
Player fastest = GetFastestPlayer(); 
if (myFavorite == fastest) 
    // I'm happy 
+0

参照を比較して、同じオブジェクトであるかどうかを確認してください。 –

+4

@EpicNobody: 'System.Object'に' .Equals() 'を実装するのは本当に賢明な方法です。そうでなければ、そのクラスはそれを継承するクラスを何も知らないからです。 – David

4

ジョナサンRienhartが正しいか - あなたはEqualsを上書きしない限り、あなただけインスタンス、ない値をチェックしています。 2つのオブジェクトが同じオブジェクトであるかどうかは関係ありません。同じオブジェクトではない場合は同じではありません。私も自分と同じ人ですが、私は同じ双子と同じ人ではありません。

Equals演算子をオーバーライドすると、等価を構成するものを定義することができます。たとえば、同じスコアを持つ場合、2つのPlayersを等しいと見なすことができます。

public override bool Equals(Object obj) 
{ 
    var player = (Player)obj; 

    if (player != null && player.score== this.score) 
     return true; 

    return false; 
} 

通常、この2人のプレーヤーが同じであることは望ましくありません。確かに同じスコアの2人のプレイヤーを持つことは可能ですか?

+1

'Equals'を実装するとき、' InvalidCastException'を避けるために 'var player = obj as Player 'を実行します。 –

+0

@JimSchubert良い点。 –

関連する問題