Есть два примера реализации GetHashCode и Equals. Оба из решарпера, в разных местах он по-разному делает. Вопрос в чём разница.
Вариант №1
public class Person
{
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string FamilyName { get; set; }
public bool Equals( Person obj )
{
if ( ReferenceEquals( null, obj ) ) return false;
if ( ReferenceEquals( this, obj ) ) return true;
return Equals( obj.FamilyName, FamilyName ) && Equals( obj.FirstName, FirstName ) && Equals( obj.MiddleName, MiddleName );
}
public override bool Equals( object obj )
{
if ( ReferenceEquals( null, obj ) ) return false;
if ( ReferenceEquals( this, obj ) ) return true;
if ( obj.GetType() != typeof( Person ) ) return false;
return Equals( (Person)obj );
}
public override int GetHashCode()
{
unchecked
{
int result = ( FamilyName != null ? FamilyName.GetHashCode() : 0 );
result = ( result * 397 ) ^ ( FirstName != null ? FirstName.GetHashCode() : 0 );
result = ( result * 397 ) ^ ( MiddleName != null ? MiddleName.GetHashCode() : 0 );
return result;
}
}
}
Вариант №2, идентичный тому, что компилятор C#3 строит для анонимных классов.
public class Person2
{
public string FirstName { get; set; }
public string MiddleName { get; set; }
public string FamilyName { get; set; }
public override bool Equals( object value )
{
var type = value as Person2;
return ( type != null ) && EqualityComparer<string>.Default.Equals( type.FirstName, FirstName ) && EqualityComparer<string>.Default.Equals( type.MiddleName, MiddleName ) && EqualityComparer<string>.Default.Equals( type.FamilyName, FamilyName );
}
public override int GetHashCode()
{
int num = 0x7a2f0b42;
num = ( -1521134295 * num ) + EqualityComparer<string>.Default.GetHashCode( FirstName );
num = ( -1521134295 * num ) + EqualityComparer<string>.Default.GetHashCode( MiddleName );
return ( -1521134295 * num ) + EqualityComparer<string>.Default.GetHashCode( FamilyName );
}
}