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

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

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

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 146 147 148 149 150 151 152 153 154 ... 642
Перейти на страницу:

// Предположим, что имеется свойство SSN.

class Person

{

  public string SSN {get; } = &quot;&quot;;

  public Person(string fName, string lName, int personAge,

    string ssn)

  {

    FirstName = fName;

    LastName = lName;

    Age = personAge;

    SSN = ssn;

  }

  // Возвратить хеш-код на основе уникальных строковых данных.

  public override int GetHashCode() =&gt; SSN.GetHashCode();

}

В случае использования в качестве основы хеш-кода свойства, допускающего чтение и запись, вы получите предупреждение. После того, как объект создан, хеш-код должен быть неизменяемым. В предыдущем примере свойство SSN имеет только метод get, что делает его допускающим только чтение, и устанавливать его можно только в конструкторе.

Если вы не можете отыскать единый фрагмент уникальных строковых данных, но есть переопределенный метод ToString(), который удовлетворяет соглашению о доступе только по чтению, тогда вызывайте GetHashCode() на собственном строковом представлении:

// Возвратить хеш-код на основе значения, возвращаемого

// методом ToString() для объекта Person.

public override int GetHashCode() =&gt; ToString().GetHashCode();

Тестирование модифицированного класса Person

Теперь, когда виртуальные члены класса Object переопределены, обновите операторы верхнего уровня, чтобы протестировать внесенные изменения:

Console.WriteLine(&quot;***** Fun with System.Object *****n&quot;);

// ПРИМЕЧАНИЕ: мы хотим, чтобы эти объекты были идентичными

// в целях тестирования методов Equals() и GetHashCode().

Person p1 = new Person(&quot;Homer&quot;, &quot;Simpson&quot;, 50, &quot;111-11-1111&quot;);

Person p2 = new Person(&quot;Homer&quot;, &quot;Simpson&quot;, 50, &quot;111-11-1111&quot;);

// Получить строковые версии объектов.

Console.WriteLine(&quot;p1.ToString() = {0}&quot;, p1.ToString());

Console.WriteLine(&quot;p2.ToString() = {0}&quot;, p2.ToString());

// Протестировать переопределенный метод Equals().

Console.WriteLine(&quot;p1 = p2?: {0}&quot;, p1.Equals(p2));

// Протестировать хеш-коды.

// По-прежнему используется хеш-значение SSN

Console.WriteLine(&quot;Same hash codes?: {0}&quot;, p1.GetHashCode() == p2.GetHashCode());

Console.WriteLine();

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

// Изменить значение Age объекта p2 и протестировать снова.

p2.Age = 45;

Console.WriteLine(&quot;p1.ToString() = {0}&quot;, p1.ToString());

Console.WriteLine(&quot;p2.ToString() = {0}&quot;, p2.ToString());

Console.WriteLine(&quot;p1 = p2?: {0}&quot;, p1.Equals(p2));

// По-прежнему используется хеш-значение SSN

Console.WriteLine(&quot;Same hash codes?: {0}&quot;, p1.GetHashCode() == p2.GetHashCode());

Console.ReadLine();

Ниже показан вывод:

***** Fun with System.Object *****

p1.ToString() = [First Name: Homer; Last Name: Simpson; Age: 50]

p2.ToString() = [First Name: Homer; Last Name: Simpson; Age: 50]

p1 = p2?: True

Same hash codes?: True

p1.ToString() = [First Name: Homer; Last Name: Simpson; Age: 50]

p2.ToString() = [First Name: Homer; Last Name: Simpson; Age: 45]

p1 = p2?: False

Same hash codes?: True

Использование статических членов класса System.Object

В дополнение к только что рассмотренным членам уровня экземпляра класс System.Object определяет два статических члена, которые также проверяют эквивалентность на основе значений или на основе ссылок. Взгляните на следующий код:

static void StaticMembersOfObject()

{

  // Статические члены System.Object.

  Person p3 = new Person(&quot;Sally&quot;, &quot;Jones&quot;, 4);

  Person p4 = new Person(&quot;Sally&quot;, &quot;Jones&quot;, 4);

  Console.WriteLine(&quot;P3 and P4 have same state: {0}&quot;,

                    object.Equals(p3, p4));

                  // Р3 и P4 имеют то же самое состояние

  Console.WriteLine(&quot;P3 and P4 are pointing to same object: {0}&quot;,

                    object.ReferenceEquals(p3, p4));

                  // Р3 и P4 указывают на тот же самый объект

}

Здесь вы имеете возможность просто отправить два объекта (любого типа) и позволить классу System.Object выяснить детали автоматически. Ниже показан вывод, полученный в результате вызова метода StaticMembersOfObject() в операторах верхнего уровня:

***** Fun with System.Object *****

P3 and P4 have the same state: True

1 ... 146 147 148 149 150 151 152 153 154 ... 642
Перейти на страницу:
На этой странице вы можете бесплатно читать книгу Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю бесплатно.
Комментарии
Открыть боковую панель
Комментарии
Лариса
Лариса 11.03.2026 - 20:17
Странно,здесь имя девочки Аграфена,а на других сайтах я прослушала три книги этого цикла с именем Дарвина.Зачем менять имя и путать читателей? Опечатка- не Дарвина,  а  Дарина.
Григорий
Григорий 09.04.2025 - 22:24
Лучшая книга всех времен
Женя
Женя 02.04.2025 - 16:08
Любимая книга