Object.Equals(x, y)
будет:
- Возвращение верно, если
x
и y
оба нуль
- Возврат ложно, если точно один из
x
или y
is null
- В противном случае позвоните либо
x.Equals(y)
, либо y.Equals(x)
- его не должно вопрос, который. Это означает, что независимо от того, какое политическое поведение было реализовано с помощью времени выполнения, тип объекта x
или y
ссылается на него.
ReferenceEquals
будет не вызов полиморфного Equals
метод. Это только сравнивает ссылки для равенства. Например:
string x = new StringBuilder("hello").ToString();
string y = new StringBuilder("hello").ToString();
Console.WriteLine(Object.Equals(x, y)); // True
Console.WriteLine(Object.ReferenceEquals(x, y)); // False
Console.WriteLine(x == y); // True due to overloading
Теперь, если вы только проверки недействительности, то вы действительно не хотите полиморфный поведение - просто ссылаться на равенство. Поэтому не стесняйтесь использовать ReferenceEquals
.
Вы могли также использование ==
, но это может быть перегружен (не переопределяется) по классам - это в случае строки, как показано выше. Наиболее распространенный случай использования ReferenceEquals
в моем опыте, когда вы реализации==
:
public bool operator ==(Foo x1, Foo x2)
{
if (ReferenceEquals(x1, x2))
{
return true;
}
if (ReferenceEquals(x1, null) || ReferenceEquals(x2, null))
{
return false;
}
return x1.Equals(x2);
}
Здесь вы действительно не хотите позвонить ==
реализации, так как он будет рекурсию навсегда - вы хотите очень определенная ссылочная семантика равенства.
Как вы изменяете содержание сообщения без его показа, как отредактировано? –
@ Rune: если вы отредактируете его в течение первых 5 минут публикации, он не появится. –