В чём разница?
От: SergASh  
Дата: 26.06.08 18:27
Оценка:
Есть два примера реализации 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 );
  }
}
Re: В чём разница?
От: ksg71 Германия  
Дата: 27.06.08 07:35
Оценка:
Здравствуйте, SergASh, Вы писали:

SAS>Есть два примера реализации GetHashCode и Equals. Оба из решарпера, в разных местах он по-разному делает. Вопрос в чём разница.


второй вариант для анонимных может и годится, а для не sealed Person


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 );
  }


выделенное не есть правильно, в случае если тип аргумента SomeDerivedPerson : Person
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.