2011-11-11 5 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; 
    } 
} 

개미가 나는이 같은 두 선수의 인스턴스화 : 왜()이 같이 사용하는 경우 false를 반환 같음을 수행하는

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를 오버라이드 (override)하지 않는 한 당신은 경우이 아닌 값을 확인하고 있습니다. 두 객체가 동일한 객체인지, 같은 객체가 아닌지 여부는 중요하지 않습니다. 또한보십시오 : 나는 나 자신과 같은 사람이지만, 나는 내 일란성 쌍둥이와 같은 사람이 아닙니다.

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'을 구현할 때'InvalidCastException'을 피하기 위해'var player = obj as Player '를 사용합니다. –

+0

@JimSchubert 좋은 지적. –

관련 문제