Two differences:
Equals
is polymorphic (i.e. it can be overridden, and the implementation used will depend on the execution-time type of the target object), whereas the implementation of ==
used is determined based on the compile-time types of the objects:
// Avoid getting confused by interning
object x = new StringBuilder("hello").ToString();
object y = new StringBuilder("hello").ToString();
if (x.Equals(y)) // Yes
// The compiler doesn't know to call ==(string, string) so it generates
// a reference comparision instead
if (x == y) // No
string xs = (string) x;
string ys = (string) y;
// Now *this* will call ==(string, string), comparing values appropriately
if (xs == ys) // Yes
Equals
will throw an exception if you call it on null, == won't
string x = null;
string y = null;
if (x.Equals(y)) // NullReferenceException
if (x == y) // Yes
Note that you can avoid the latter being a problem using object.Equals
:
if (object.Equals(x, y)) // Fine even if x or y is null
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…