El comportamiento del operador == depende de cómo se haya declarado la variable a la que lo está aplicando (no en la clase del objeto, agregaré un ejemplo).
Para tipos de valores, comparará sus valores.
Para los tipos de referencia a == b devuelve verdadero si a es el mismo objeto que b, a menos que el operador == esté sobrecargado. No reemplazado como otros dijeron, no puede anular operadores en C# porque no son virtuales.
object obj_a, obj_b; string str_a, str_b;
str_a = "ABC";
str_b = new string("ABC".ToCharArray());
obj_a = str_a;
obj_b = str_b;
Console.WriteLine("str_a == str_b = {0}", str_a == str_b); // in string == operator is overloaded
Console.WriteLine("str_a.Equals(str_b) = {0}", str_a.Equals(str_b)); // string overrides Object.Euqals
Console.WriteLine("obj_a == obj_b = {0}", obj_a == obj_b); // in object == operator is not overloaded
Console.WriteLine("obj_a.Equals(obj_b) = {0}", obj_a.Equals(obj_b)); // Object.Equesl is virtual and overridden method from string will be executed.
Console.ReadKey();
La salida de ese programa es
str_a == str_b = True
str_a.Equals(str_b) = True
obj_a == obj_b = False
obj_a.Equals(obj_b) = True
Sólo una información rápida: si sobrecarga ==, también debe implementar =!. Lo mismo vale para <= and > =. – Tarik