Это не необходимо в том смысле, что оно может не требоваться для корректности, но структура, конечно, не "заботится об этом", поэтому может быть полезным дляв, как правило, из соображений производительности.
Одно замечание: если реализация обернута EqualityComparer<T>.Default
, она не вводит код пользователя, если один или оба аргумента равны null
, поэтому в этом случае она выполняет некоторую меру ссылкипроверка (если не полная ReferenceEquals(x, y)
).
public override bool Equals(T x, T y)
{
if (x != null)
{
return ((y != null) && x.Equals(y));
}
if (y != null)
{
return false;
}
return true;
}
Не по теме, в вашем примере метода есть несколько проблем с разыменованием (other
может быть null
, this.system
может бытьnull
).
Я бы написал ваш метод примерно так:
public bool Equals(Foo other)
{
if(other == null)
return false;
if(other == this)
return true;
return value == other.value
&& EqualityComparer<Bar>.Default.Equals(bar, other.bar)
// You don't *have to* go down the EqualityComparer route
// but you do need to make sure you don't dereference null.
}
Также не забудьте переопределить GetHashCode
всякий раз, когда вы пишете свое собственное равенство.сравнения.