Операторы равенства
Перегрузки operator == и operator !=
объявляют парой. Вместе с ними переопределяют
Equals и GetHashCode - иначе сравнение
и хеш-код разойдутся. Для ссылочных типов в
operator == обычно проверяют null.
Синтаксис
public static bool operator ==(Тип left, Тип right)
public static bool operator !=(Тип left, Тип right)
public override bool Equals(object obj)
public override int GetHashCode()
Пример
Давайте сравним два объекта с одинаковым полем:
using System;
class Code
{
public int Value;
public static bool operator ==(Code left, Code right)
{
if (ReferenceEquals(left, right))
{
return true;
}
if (left is null || right is null)
{
return false;
}
return left.Value == right.Value;
}
public static bool operator !=(Code left, Code right)
{
return !(left == right);
}
public override bool Equals(object obj)
{
return obj is Code other && this == other;
}
public override int GetHashCode()
{
return Value.GetHashCode();
}
}
class Program
{
static void Main()
{
var first = new Code { Value = 5 };
var second = new Code { Value = 5 };
Console.WriteLine(first == second);
}
}
Результат выполнения кода:
True
Пример
Давайте проверим неравенство через operator !=:
using System;
class Code
{
public int Value;
public static bool operator ==(Code left, Code right)
{
if (ReferenceEquals(left, right))
{
return true;
}
if (left is null || right is null)
{
return false;
}
return left.Value == right.Value;
}
public static bool operator !=(Code left, Code right)
{
return !(left == right);
}
public override bool Equals(object obj)
{
return obj is Code other && this == other;
}
public override int GetHashCode()
{
return Value.GetHashCode();
}
}
class Program
{
static void Main()
{
var first = new Code { Value = 1 };
var second = new Code { Value = 2 };
Console.WriteLine(first != second);
}
}
Результат выполнения кода:
True
Пример
Давайте сравним равенство полей в структуре:
using System;
struct Cell
{
public int Id;
public static bool operator ==(Cell left, Cell right)
{
return left.Id == right.Id;
}
public static bool operator !=(Cell left, Cell right)
{
return !(left == right);
}
public override bool Equals(object obj)
{
return obj is Cell other && this == other;
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
}
class Program
{
static void Main()
{
var first = new Cell { Id = 3 };
var second = new Cell { Id = 3 };
Console.WriteLine(first.Equals(second));
}
}
Результат выполнения кода:
True
Смотрите также
-
операторы
< и >,
которые задают порядок сравнения -
метод
Equals,
который переопределяют вместе с == -
метод
GetHashCode,
который согласуют с равенством -
ключевое слово
record,
где равенство полей генерируется автоматически