Язык программирования C#9 и платформа .NET5
Часть 228 из 642 Информация о книге
private sealed class <>f__AnonymousType0'3'<'<Color>j__TPar','<Make>j__TPar', <CurrentSpeed>j__TPar>'extends [System.Runtime][System.Object]{// Поля только для инициализации.private initonly <Color>j__TPar <Color>i__Field;private initonly <CurrentSpeed>j__TPar <CurrentSpeed>i__Field;private initonly <Make>j__TPar <Make>i__Field;// Стандартный конструктор.public <>f__AnonymousType0(<Color>j__TPar Color,<Make>j__TPar Make, <CurrentSpeed>j__TPar CurrentSpeed);// Переопределенные методы.public override bool Equals(object value);public override int GetHashCode();public override string ToString();// Свойства только для чтения.<Color>j__TPar Color { get; }<CurrentSpeed>j__TPar CurrentSpeed { get; }<Make>j__TPar Make { get; }}Реализация методов ToString() и GetHashCode()
Все анонимные типы автоматически являются производными от
и предоставляют переопределенные версии методовSystem.Object,Equals()иGetHashCode(). РеализацияToString()просто строит строку из пар "имя-значение". Вот пример:ToString()public override string ToString(){StringBuilder builder = new StringBuilder();builder.Append("{ Color = ");builder.Append(this.<Color>i__Field);builder.Append(", Make = ");builder.Append(this.<Make>i__Field);builder.Append(", CurrentSpeed = ");builder.Append(this.<CurrentSpeed>i__Field);builder.Append(" }");return builder.ToString();}Реализация
вычисляет хеш-значение, используя каждую переменную-член анонимного типа в качестве входных данных для типаGetHashCode(). С такой реализациейSystem.Collections.Generic.EqualityComparer<T>два анонимных типа будут выдавать одинаковые хеш-значения тогда (и только тогда), когда они обладают одним и тем же набором свойств, которым присвоены те же самые значения. Благодаря подобной реализации анонимные типы хорошо подходят для помещения внутрь контейнераGetHashCode().HashtableСемантика эквивалентности анонимных типов
Наряду с тем, что реализация переопределенных методов
иToString()прямолинейна, вас может интересовать, как был реализован методGetHashCode(). Например, если определены две переменные "анонимных автомобилей" с одинаковыми наборами пар "имя-значение", то должны ли эти переменные считаться эквивалентными? Чтобы увидеть результат такого сравнения, дополните классEquals()следующим новым методом:Programstatic void EqualityTest(){// Создать два анонимных класса с идентичными наборами// пар "имя-значение".var firstCar = new { Color = "Bright Pink", Make = "Saab",CurrentSpeed = 55 };var secondCar = new { Color = "Bright Pink", Make = "Saab",CurrentSpeed = 55 };// Считаются ли они эквивалентными, когда используется Equals()?if (firstCar.Equals(secondCar)){Console.WriteLine("Same anonymous object!");// Тот же самый анонимный объект}else{Console.WriteLine("Not the same anonymous object!");// He тот же самый анонимный объект}// Можно ли проверить их эквивалентность с помощью операции ==?if (firstCar == secondCar){Console.WriteLine("Same anonymous object!");// Тот же самый анонимный объект}else{Console.WriteLine("Not the same anonymous object!");// He тот же самый анонимный объект}// Имеют ли эти объекты в основе один и тот же тип?if (firstCar.GetType().Name == secondCar.GetType().Name){