Насколько я знаю, вам нужно только переопределить их, если вам нужна семантика равенства значений. Реализация System.Object не является «плохим», она просто выполняет только контрольную проверку (которая может быть реализована на этом уровне).
Вкратце: если вам нужно какое-то основанное на значении равенство (равенство, основанное на свойствах класса), то да, отменить. В противном случае, это должно быть более чем хорошо.
EDIT: Вы только нужно переопределить их в случае, описанном выше. Если вы переопределите один из них, вам необходимо переопределить оба по очевидным причинам (они должны быть согласованными и т. Д.). Вы можете переопределить их по каждому классу по другим причинам, указанным в других ответах (например, производительность в алгоритмах, использующих хэш-значение, то есть Dictionary
ключей и т. Д.), Но вам не нужно, реализация по умолчанию System.Object
будет работать правильно ,
EDIT 2: Запрошенная дополнительная информация, поэтому здесь идет. Рассмотрим следующий псевдо-класс:
public class User {
private int _id;
private string _username;
public string Username { get {return _username;}};
// [snip] Whatever other properties we might like to have.
public User(string username) {
// Initialise our user from a database, or whatever.
}
}
Как можно заметить, следующий код, может показаться интуитивно:
User foo = new User("me");
User bar = new User("me");
User baz = foo;
if (foo.Equals(bar)) {
Console.WriteLine("1: Success!");
}
if (foo.Equals(baz)) {
Console.WriteLine("2: Success!");
}
Но он будет печатать только:
2: Успех
Почему? foo
и bar
- это два отдельных экземпляра класса и имеют отдельные ссылки. Ссылка похожа на указатель на C/C++. foo и baz - одна и та же ссылка, потому что одна из них была назначена из другой. Все они имеют одинаковое значение , хотя пользователь назвал «я». Реализация образца стоимости на основе .Equals
реализации может быть:
partial class User {
public override bool Equals(object b) {
if (b == null) return false;
if (b.GetType() != this.GetType()) return false;
// Now the heavy lifting
User other = (User)b;
if (other._id == this._id) return true;
else return false;
}
}
Посмотрите, как он проверяет против части свойств класса для определения равенства? Это равенство ценности на работе. Равенство ссылок было бы просто простой проверкой this == b
.
Отличная точка. – Alan