Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Иногда необходимо сравнить два значения для равенства. В некоторых случаях вы проверяете равенство значений, также известное как эквивалентность, что означает, что значения, содержащиеся в двух переменных, равны. В других случаях необходимо определить, относятся ли две переменные к одному базовому объекту в памяти. Этот тип равенства называется ссылочным равенством или тождеством. В этом разделе описаны два типа равенства и ссылки на другие разделы для получения дополнительных сведений.
Равенство ссылок
Равенство ссылок означает, что два ссылки на объекты ссылаются на один и тот же базовый объект. Это может произойти с помощью простого назначения, как показано в следующем примере.
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# и ссылки на дополнительные сведения. |
Записи | Предоставляет сведения о типах записей, которые проверяют равенство значений по умолчанию. |