Небольшие варианты форм, уже опубликованные несколькими другими ...
using System;
...
public override bool Equals ( object obj ) {
return Equals(obj as SomeClass);
}
public bool Equals ( SomeClass someInstance ) {
return Object.ReferenceEquals( this, someInstance )
|| ( !Object.ReferenceEquals( someInstance, null )
&& this.Value == someInstance.Value );
}
public static bool operator ==( SomeClass lhs, SomeClass rhs ) {
if( Object.ReferenceEquals( lhs, null ) ) {
return Object.ReferenceEquals( rhs, null );
}
return lhs.Equals( rhs );
//OR
return Object.ReferenceEquals( lhs, rhs )
|| ( !Object.ReferenceEquals( lhs, null )
&& !Object.ReferenceEquals( rhs, null )
&& lhs.Value == rhs.Value );
}
public static bool operator !=( SomeClass lhs, SomeClass rhs ) {
return !( lhs == rhs );
// OR
return ( Object.ReferenceEquals( lhs, null ) || !lhs.Equals( rhs ) )
&& !Object.ReferenceEquals( lhs, rhs );
}
Попытка найти способ реализации оператора == с использованием Equals, чтобы избежать дублирования логики сравнения значений ... без каких-либо избыточных тестов (вызовы ReferenceEquals с теми же параметрами) или ненужных тестов (это не может быть нулевым в метод instance.Equals) и без каких-либо явных условий («ifs»). Больше тизер ума, чем что-либо полезное.
Самое близкое, что я могу придумать, это то, но оно кажется как будто это возможно без дополнительного метода:)
public bool Equals ( SomeClass someInstance ) {
return Object.ReferenceEquals( this, someInstance )
|| (!Object.ReferenceEquals( someInstance, null ) && EqualsNonNullInstance( someInstance );
}
public static bool operator ==( SomeClass lhs, SomeClass rhs ) {
return Object.ReferenceEquals( lhs, rhs )
|| ( !Object.ReferenceEquals( lhs, null ) && !Object.ReferenceEquals( rhs, null ) && lhs.EqualsNonNullInstance( rhs ) );
}
//super fragile method which returns logical non-sense
protected virtual bool EqualsNonNullInstance ( SomeClass someInstance ) {
//In practice this would be a more complex method...
return this.Value == someInstance.Value;
}
Вспоминая, насколько все это утомительно и подвержено ошибкам (я почти уверен, что в приведенном выше коде есть ошибка ... которая все еще отстой, потому что кто хочет создать подкласс типа просто , чтобы немного проверить на равенство проще?), в будущем, я думаю, я просто создам некоторые статические методы, которые обрабатывают все проверки на ноль и принимают делегат или требуют и интерфейс для выполнения сравнения значений (единственная часть, которая действительно изменяет тип на тип).
Было бы замечательно, если бы мы могли просто добавить атрибуты к полям / свойствам / методам, которые необходимо сравнить, и позволить компилятору / среде выполнения обрабатывать всю скуку.
Также убедитесь, что значения GetHashCode () равны для любых случаев, когда .Equals (объект) возвращает true или может произойти сумасшедшее дерьмо.