2010-03-01 16 views
12

En Java, hay operadores "==" y "iguales" para los tipos de referencia y "==" para los tipos de valores. para el tipo de referencia, "==" significa que ambos objetos apuntan a la misma ubicación y "igual" significa que sus valores son los mismos. ¿C# tiene operadores similares para tipo de valor y tipos de referencia?C# == es diferente en tipos de valores y tipos de referencia?

Respuesta

15

Bueno, == puede estar sobrecargado para los tipos de referencia. Por ejemplo:

string a = new string('x', 10); 
string b = new string('x', 10); 
Console.WriteLine(a == b); // True 
Console.WriteLine(Object.ReferenceEquals(a, b)); // False 

A menos que esté sobrecargado, == significa "igualdad de referencia" o "identidad del objeto" para los tipos de referencia. (Como dice Marc, puede anular Equals sin sobrecargar ==.)

Para tipos de valor, tiene que sobrecargar == de lo contrario, el compilador de C# no le permitirá usarlo para las comparaciones. .NET en sí proporcionará una implementación de Equals que generalmente hace lo correcto, pero a veces lentamente - en la mayoría de los casos, si escribe su propio tipo de valor personalizado, querrá implementar IEquatable<T> y anular Equals también - y muy posiblemente sobrecargar varios operadores.

8

C# permite al operador == a estar sobrecargado (y el método Equals a ser anulado - aunque == y Equals No tiene para significar la misma cosa).

Si quiere decir "la misma instancia", entonces object.ReferenceEquals (para tipos de referencia) es la mejor opción. Tipos de valor predeterminados para igualdad interna.

2

recta de MSDN:

Para los tipos de valor predefinido, el operador igualdad (==) devuelve verdadero si los valores de sus operandos son iguales, falso en caso contrario. Para los tipos de referencia que no sean cadenas, == devuelve verdadero si sus dos operandos se refieren al mismo objeto . Para el tipo de cadena, == compara los valores de las cadenas.

Jon Skeet debería ser capaz de darle una respuesta perfecta aunque: P

+0

Él ya te gana! – leppie

+0

Sí, ¡me ganó 46 segundos! Cuando estaba escribiendo mi respuesta, supe que Jon proporcionaría una muy buena respuesta. – Kelsey

0

Ésta es precisamente la forma en que funciona con .NET también. El C# FAQ blog explains equals better:

El método equals es sólo un Portal definido en System.Object, y anulado por lo que las clases eligen para hacerlo. El operador == es un operador que puede estar sobrecargado por las clases , pero que generalmente tiene un comportamiento de identidad .

Para los tipos de referencia, donde == no ha sido sobrecargado, si se compara dos referencias se refieren al mismo objeto - que es exactamente lo que la aplicación de Iguales hace en System.Object.

Cuestiones relacionadas