Сравнения на равенство (Руководство по программированию на C#)

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

Равенство ссылок

Равенство ссылок означает, что два объекта ссылаются на один и тот же объект.Это может произойти при простом присваивании, как показано в следующем примере.

using System;
class Test
{
    public int Num { get; set; }
    public string Str { get; set; }

    static void Main()
    {
        Test a = new Test() { Num = 1, Str = "Hi" };
        Test b = new Test() { Num = 1, Str = "Hi" };

        bool areEqual = System.Object.ReferenceEquals(a, b);
        // False:
        System.Console.WriteLine("ReferenceEquals(a, b) = {0}", areEqual);

        // Assign b to a.
        b = a;

        // Repeat calls with different results.
        areEqual = System.Object.ReferenceEquals(a, b);
        // True:
        System.Console.WriteLine("ReferenceEquals(a, b) = {0}", areEqual);

        // Keep the console open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}

В этом фрагменте кода создается два объекта, но после инструкции присваивания они оба ссылаются на один и тот же объект.Поэтому между ними устанавливается равенство ссылок.Метод Object.ReferenceEquals позволяет определить, относятся ли две ссылки к одному и тому же объекту.

Концепция равенства ссылок применима только к ссылочным типам.Объекты типа значения не могут иметь равенства ссылок, поскольку, когда переменной присваивается экземпляр типа значения, создается копия этого значения.Поэтому две распакованные структуры никогда не могут ссылаться на одно и то же расположение в памяти.Более того, если для сравнения двух типов значения используется метод ReferenceEquals, всегда будет возвращаться результат false, даже если содержащиеся в объектах значения идентичны.Это связано с тем, что каждая переменная запакована в отдельный экземпляр объекта.Дополнительные сведения см. в разделе Практическое руководство. Тестирование на равенство (идентичность) ссылок (Руководство по программированию на C#).

Равенство значений

Равенство значений означает, что два объекта содержат одинаковое значение или одинаковые значения.Для примитивных типов значений, таких как int и bool, проверка на равенство значений представляет собой очевидную задачу.Можно использовать оператор ==, как показано в следующем примере.

int a = GetOriginalValue();
int b = GetCurrentValue();

// Test for value equality. 
if( b == a) 
{
    // The two integers are equal.
}

Для большинства других типов проверка равенства значений является более сложной, поскольку при этом необходимо понимать, как равенство определено в типе.Для всех классов и структур, имеющих несколько полей или свойств, равенство значений часто определяется как равенство значений всех полей и свойств.Например, два объекта Point могут быть определены как равные, если значение pointA.X равняется pointB.X, а значение pointA.Y равняется pointB.Y.

Однако общего требования о том, что равенство должно определяться на основе всех полей в типе, нет.Оно может определяться и на основе части полей.При сравнении значений типов сторонних разработчиков необходимо понимать, как именно реализовано равенство для таких типов.Дополнительные сведения об определении равенства значений в собственных классах и структурах см. в разделе Практическое руководство. Определение равенства значений для типа (Руководство по программированию на C#).

Dd183752.collapse_all(ru-ru,VS.110).gifРавенство значений с плавающей запятой

Проверка равенства значений с плавающей запятой (double и float) представляет проблему из-за неточности арифметических операций с плавающей запятой на двоичных компьютерах.Дополнительные сведения см. в примечаниях в разделе System.Double.

Связанные разделы

Заголовок

Описание

Практическое руководство. Тестирование на равенство (идентичность) ссылок (Руководство по программированию на C#)

Описание процедуры проверки равенства ссылок двух переменных.

Практическое руководство. Определение равенства значений для типа (Руководство по программированию на C#)

Предоставление пользовательского определения равенства значений для типа.

Руководство по программированию на C#

Ссылки на подробные сведения о важных элементах языка C#, а также об элементах, доступных в этом языке благодаря .NET Framework.

Типы (Руководство по программированию на C#)

Сведения о системе типов C# и ссылки на дополнительные сведения.

См. также

Основные понятия

Руководство по программированию на C#