Сравнения на равенство (Руководство по программированию на 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#).
Равенство значений с плавающей запятой
Проверка равенства значений с плавающей запятой (double и float) представляет проблему из-за неточности арифметических операций с плавающей запятой на двоичных компьютерах.Дополнительные сведения см. в примечаниях в разделе System.Double.
Связанные разделы
Заголовок |
Описание |
---|---|
Описание процедуры проверки равенства ссылок двух переменных. |
|
Предоставление пользовательского определения равенства значений для типа. |
|
Ссылки на подробные сведения о важных элементах языка C#, а также об элементах, доступных в этом языке благодаря .NET Framework. |
|
Сведения о системе типов C# и ссылки на дополнительные сведения. |