2011-08-09 2 views
2

Почти каждый раз, когда я хочу, чтобы проверить равенство объекта к null я использую обычную проверку равенства операцииЧто разница между Object.equals (объект, нуль) и OBJ == NULL

if (obj == null) 

Недавно я заметил, что использую в Object.Equals() чаще

if (Object.Equals(obj, null)) 

и при чтении о нулевых проверках я кладезь этого Is ReferenceEquals(null, obj) the same thing as null == obj?

if (ReferenceEquals(null, obj)) 

В чем разница? и где/когда использовать их? плюс я обнаружил, что последние две проверки выглядят одинаково в соответствии с их summary

ответ

12

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); 
} 

Здесь вы действительно не хотите позвонить == реализации, так как он будет рекурсию навсегда - вы хотите очень определенная ссылочная семантика равенства.

+0

Как вы изменяете содержание сообщения без его показа, как отредактировано? –

+1

@ Rune: если вы отредактируете его в течение первых 5 минут публикации, он не появится. –

Смежные вопросы