Сравнения на равенство (Руководство по программированию на 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();
    }
}

В этом фрагменте кода создается два объекта, но после инструкции присваивания они оба ссылаются на один и тот же объект. Поэтому между ними устанавливается равенство ссылок. Метод 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#).

Равенство значений с плавающей запятой

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

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

Заголовок

Описание

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

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

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

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

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

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

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

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

См. также

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

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