Поделиться через


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

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

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

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

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

    public 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) = {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) = {areEqual}");
    }
}

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

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

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

Равенство значений означает, что два объекта содержат одно и то же значение или значения. Для примитивных типов значений, таких как 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. Для записей равенство значений означает, что две переменные типа записи равны, если типы совпадают, а все значения свойств и полей совпадают.

Однако не требуется, чтобы эквивалентность была основана на всех полях в типе. Он может быть основан на подмножестве. При сравнении типов, которыми вы не владеете, необходимо точно понять, как для этого типа определена эквивалентность. Дополнительные сведения о том, как определить равенство значений в собственных классах и структуре, см. в статье "Определение равенства значений для типа".

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

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

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