Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теоретический_курс.doc
Скачиваний:
36
Добавлен:
10.11.2019
Размер:
7.68 Mб
Скачать

3. Идентификация и равенство значений

Сравнивая два объекта на предмет равенства, сначала необходимо определить, нужно ли узнать, представляют ли две переменные один объект в памяти или значения одного или нескольких их полей являются равными. Если планируется сравнить значения, следует решить, являются ли объекты экземплярами типов значений (структурами) или ссылочными типами (классами, делегатами, массивами).

  • Чтобы определить, ссылаются ли два экземпляра класса на одно расположение в памяти (это значит, что они имеют одинаковый идентификатор), воспользуйтесь статическим методом Equals.(System.Object является неявным базовым классом для всех типов значений и ссылочных типов, включая структуры и классы, определенные пользователем).

  • Чтобы определить, имеют ли поля экземпляра в двух экземплярах структур одинаковые значения, воспользуйтесь методом ValueType.Equals.Поскольку все структуры неявно наследуют от System.ValueType, метод может быть вызван непосредственно в объекте, как показано в следующем примере.

Слегка перепишем код метода Main для классов предыдущего примера и добавим:

Person p1 = new Person("Bob The Zealot", 75);

Person p2 = new Person("1", 1);

p2 = p1;

// Выведет: p2 и p1 имеют одинаковые значения

if (p2.Equals(p1))

Console.WriteLine("p2 и p1 имеют одинаковые значения");

Console.WriteLine("Для продолжение нажмите любую клавишу . . . ");

Console.ReadKey();

Слегка перепишем код метода Main для структур предыдущего примера и добавим:

Person p1 = new Person("Wallace", 75);

Person p2;

p2.Name = "Wallace";

p2.Age = 75;

// Выведет: p2 и p1 имеют одинаковые значения

if (p2.Equals(p1))

Console.WriteLine("p2 и p1 имеют одинаковые значения");

Console.WriteLine("Для продолжение нажмите любую клавишу . . .");

Console.ReadKey();

Реализация System.ValueType Equals использует отображение, поскольку необходимо определить поля, находящиеся в любой структуре. При создании собственных структур переопределите метод Equals для предоставления эффективного алгоритма равенства, соответствующего вашему типу.

  • Чтобы определить, равны ли значения полей в двух экземплярах класса, можно воспользоваться методом Equals или оператором ==. Однако их следует использовать, только если они переопределены или перегружены классом, чтобы предоставить пользовательское определение равенства для объектов этого типа. Класс может также реализовывать интерфейс IEquatable<T>. или интерфейс IEqualityComparer<T>. Оба интерфейса предоставляют методы, которые можно использовать для проверки равенства значений. При создании собственных классов, переопределяющих Equals, следует выполнять инструкции из разделов Практическое руководство. Определение равенства значений для типа (Руководство по программированию на C#) (http://msdn.microsoft.com/ru-ru/library/dd183755.aspx) и Object.Equals(Object) (http://msdn.microsoft.com/ru-ru/library/bsc2ak47.aspx).