#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
??