Section 6.3: 사용자 정의 타입에 대해 Equals 와 GetHashCode 재정의하기
다음과 같은 Person 클래스가 있다고 할 때:
public class Person {}
public string Name {
get;
set;
}
public int Age {
get;
set;
}
public string Clothes {
get;
set;
}
var person1 = new Person {
Name = "Jon",
Age = 20,
Clothes = "some clothes"
};
var person2 = new Person {
Name = "Jon",
Age = 20,
Clothes = "some other clothes"
};
bool result = person1.Equals(person2); // reference 타입의 Equals 이기 때문에 false 를 반환한다
Equals
와 GetHashCode
를 다음과 같이 정의할 수 있다:
public class Person {
public string Name {
get;
set;
}
public int Age {
get;
set;
}
public string Clothes {
get;
set;
}
public override bool Equals(object obj) {
var person = obj as Person;
if (person == null) return false;
return Name == person.Name && Age == person.Age; // 같은 사람인지 비교에 있어 옷은 중요하지 않다
}
public override int GetHashCode() {
return Name.GetHashCode() * Age;
}
}
var person1 = new Person {
Name = "Jon",
Age = 20,
Clothes = "some clothes"
};
var person2 = new Person {
Name = "Jon",
Age = 20,
Clothes = "some other clothes"
};
bool result = person1.Equals(person2); // result 는 true 가 된다
또한 LINQ 를 사용하여 persons 에 대한 다른 query 를 만드는 경우 Equals 와 GetHashCode 가 모두 사용된다:
var persons = new List < Person > {
new Person {
Name = "Jon",
Age = 20,
Clothes = "some clothes"
},
new Person {
Name = "Dave",
Age = 20,
Clothes = "some other clothes"
},
new Person {
Name = "Jon",
Age = 20,
Clothes = ""
}
};
var distinctPersons = persons.Distinct().ToList(); // distinctPersons 는 Count = 2 의 값을 가지게 된다
본 문서는 C# Notes for Professionals (라이센스:CC-BY-SA) 를 한글로 번역한 문서입니다. 번역상 오류가 있을 수 있으므로 정확한 내용은 원본 문서를 참고하세요.
[출처] https://books.goalkicker.com/CSharpBook/
반응형
'번역 > C# Notes for Professionals' 카테고리의 다른 글
7.1: Null 병합 (coalescing) 연산자의 기본 사용법 (0) | 2020.12.01 |
---|---|
6.4: IEqualityComparer 에서의 Equals 와 GetHashCode (0) | 2020.11.25 |
6.2: Equals 의 기본 동작 (0) | 2020.11.23 |
6.1: 바람직한 GetHashCode 재정의하기 (0) | 2020.11.20 |
5.1: C# 에서의 동일성 (equally) 종류와 동일 연산자 (0) | 2020.11.19 |