Как работает (x, y).GetHashCode () работает за кулисами?

#c# #.net #hashcode #c#-7.0

#c# #.net #хэш-код #c #-7.0

Вопрос:

 public class Lemon{
   public int Ounces;
   public string Color;

   public override int GetHashCode() => (Ounces, Color).GetHashCode();
}
  

Мне любопытно, как это работает. (Ounces, Color) похож на анонимный тип, но не использует тот же синтаксис. И если бы это был анонимный тип, я все еще не уверен, как он узнал бы, чтобы получить уникальный хэш.

Ссылка на соответствующий исходный код .net была бы отличной. Это трудно раскрыть, так как я не уверен, в какой тип (Ounces, Color) в конечном итоге компилируется.

Комментарии:

1. Этот синтаксис (A, B) является кортежем из C # 7.

2. @Adrian: Тип был бы ValueTuple<T1, T2> , не Tuple<T1. T2> .

Ответ №1:

(Ounces, Color) это кортеж, который был введен в C # 7. Соответствующий тип ValueTuple<T1, T2> . Из справочного источника вы можете сказать, что GetHashCode() это вычисление хэш-кода путем объединения хэш-кодов каждого объекта (и дополнительного случайного начального значения) с использованием

  public static int Combine(int h1, int h2)
 {
     uint rol5 = ((uint)h1 << 5) | ((uint)h1 >> 27);
     return ((int)rol5   h1) ^ h2;
 }
  

Комментарии:

1. хороший улов для источника и для короткого, но по существу ответа

2. Разве случайное начальное значение не означает, что его (X, Y).GetHashCode не следует использовать для GetHashCode пользовательского класса, который имеет Equals(other) => other.X == X amp;amp; other.Y == Y ??