Жанры книг
Мы в соц.сетях
ParaKnig📚 » Компьютеры и Интернет » Базы данных » Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю
<< На главную

Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Читать онлайн Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 224 225 226 227 228 229 230 231 232 ... 642
Перейти на страницу:

private sealed class &lt;&gt;f__AnonymousType0'3'&lt;'&lt;Color&gt;j__TPar',

  '&lt;Make&gt;j__TPar', &lt;CurrentSpeed&gt;j__TPar&gt;'

  extends [System.Runtime][System.Object]

{

  // Поля только для инициализации.

  private initonly &lt;Color&gt;j__TPar &lt;Color&gt;i__Field;

  private initonly &lt;CurrentSpeed&gt;j__TPar &lt;CurrentSpeed&gt;i__Field;

  private initonly &lt;Make&gt;j__TPar &lt;Make&gt;i__Field;

  // Стандартный конструктор.

  public &lt;&gt;f__AnonymousType0(&lt;Color&gt;j__TPar Color,

    &lt;Make&gt;j__TPar Make, &lt;CurrentSpeed&gt;j__TPar CurrentSpeed);

  // Переопределенные методы.

  public override bool Equals(object value);

  public override int GetHashCode();

  public override string ToString();

  // Свойства только для чтения.

  &lt;Color&gt;j__TPar Color { get; }

  &lt;CurrentSpeed&gt;j__TPar CurrentSpeed { get; }

  &lt;Make&gt;j__TPar Make { get; }

}

Реализация методов ToString() и GetHashCode()

Все анонимные типы автоматически являются производными от System.Object и предоставляют переопределенные версии методов Equals(), GetHashCode() и ToString(). Реализация ToString() просто строит строку из пар "имя-значение". Вот пример:

public override string ToString()

{

  StringBuilder builder = new StringBuilder();

  builder.Append(&quot;{ Color = &quot;);

  builder.Append(this.&lt;Color&gt;i__Field);

  builder.Append(&quot;, Make = &quot;);

  builder.Append(this.&lt;Make&gt;i__Field);

  builder.Append(&quot;, CurrentSpeed = &quot;);

  builder.Append(this.&lt;CurrentSpeed&gt;i__Field);

  builder.Append(&quot; }&quot;);

  return builder.ToString();

}

Реализация GetHashCode() вычисляет хеш-значение, используя каждую переменную-член анонимного типа в качестве входных данных для типа System.Collections.Generic.EqualityComparer&lt;T&gt;. С такой реализацией GetHashCode() два анонимных типа будут выдавать одинаковые хеш-значения тогда (и только тогда), когда они обладают одним и тем же набором свойств, которым присвоены те же самые значения. Благодаря подобной реализации анонимные типы хорошо подходят для помещения внутрь контейнера Hashtable. 

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

Семантика эквивалентности анонимных типов

Наряду с тем, что реализация переопределенных методов ToString() и GetHashCode() прямолинейна, вас может интересовать, как был реализован метод Equals(). Например, если определены две переменные "анонимных автомобилей" с одинаковыми наборами пар "имя-значение", то должны ли эти переменные считаться эквивалентными? Чтобы увидеть результат такого сравнения, дополните класс Program следующим новым методом:

static void EqualityTest()

{

  // Создать два анонимных класса с идентичными наборами

  // пар &quot;имя-значение&quot;.

  var firstCar = new { Color = &quot;Bright Pink&quot;, Make = &quot;Saab&quot;,

    CurrentSpeed = 55 };

  var secondCar = new { Color = &quot;Bright Pink&quot;, Make = &quot;Saab&quot;,

    CurrentSpeed = 55 };

  // Считаются ли они эквивалентными, когда используется Equals()?

  if (firstCar.Equals(secondCar))

  {

    Console.WriteLine(&quot;Same anonymous object!&quot;);

                 // Тот же самый анонимный объект

  }

    else

  {

    Console.WriteLine(&quot;Not the same anonymous object!&quot;);

                 // He тот же самый анонимный объект

  }

  // Можно ли проверить их эквивалентность с помощью операции ==?

  if (firstCar == secondCar)

  {

    Console.WriteLine(&quot;Same anonymous object!&quot;);

                 // Тот же самый анонимный объект

  }

  else

  {

    Console.WriteLine(&quot;Not the same anonymous object!&quot;);

                 // He тот же самый анонимный объект

  }

  // Имеют ли эти объекты в основе один и тот же тип?

  if (firstCar.GetType().Name == secondCar.GetType().Name)

  {

1 ... 224 225 226 227 228 229 230 231 232 ... 642
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Лариса
Лариса 11.03.2026 - 20:17
Странно,здесь имя девочки Аграфена,а на других сайтах я прослушала три книги этого цикла с именем Дарвина.Зачем менять имя и путать читателей? Опечатка- не Дарвина,  а  Дарина.
Григорий
Григорий 09.04.2025 - 22:24
Лучшая книга всех времен
Женя
Женя 02.04.2025 - 16:08
Любимая книга