2011-11-11 65 views
2

因此,据我了解,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; 
    } 
} 

蚂蚁那么我实例化两个玩家是这样的:

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

为什么,做的equals()这样使用时返回false:

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那么你只检查实例,不是值。这两个对象是否相同并不重要,如果它们不是同一个对象,那么它们不相等。另见:我和我自己是同一个人,但我与我的同卵双胞胎不是同一个人。

如果您覆盖Equals运算符,则可以定义什么构成相等性 - 例如,如果两个Players的分数相同,可能会认为它们是相等的。

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

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

    return false; 
} 

但是,通常情况下,你不希望这两个球员是平等的。当然,有可能有两名球员得分相同吗?

+1

实现'Equals'时,我会'var player = obj作为Player;'以避免出现'InvalidCastException'。 –

+0

@JimSchubert好点。 –