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
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.
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.
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
É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.
¿Cuándo debo usar == y cuándo debo usar Equals?
http://blogs.msdn.com/csharpfaq/archive/2004/03/29/102224.aspx
- 1. ¿Cuáles son las diferencias entre los tipos de valores y los tipos de referencia en C#?
- 2. Valor y tipos de referencia
- 3. tipos de valores inmutables
- 4. Cuenta de referencia de Python y tipos
- 5. ¿Los tipos de referencia son tipos anulables?
- 6. Tipos de referencia
- 7. Tipos de referencia no anulables
- 8. C# compare dos objetos de tipos desconocidos (incluidos los tipos de referencia y valor)
- 9. Pasar tipos de valores inmutables por referencia de forma predeterminada
- 10. tipos posibles de $ _POST y $ _GET valores
- 11. C# Restricciones genéricas para incluir tipos de valores Y cadenas
- 12. Comparación de tipos de valores en caja
- 13. Valores Unboxing Tipos de objetos
- 14. Los tipos de referencia viven en el montón, los tipos de valor viven en la pila
- 15. ¿Puede un método genérico manejar los tipos de valores de referencia y valores anulables?
- 16. En C#, el uso de los tipos de valor frente a los tipos de referencia
- 17. Identificación única de tipos de referencia en el depurador
- 18. ¿Por qué el decimal en C# es diferente de otros tipos de C#?
- 19. isAssignableFrom con referencia y tipos primitivos
- 20. Operaciones en tipos de valores arbitrarios
- 21. C++ 11: referencia estándar para la acción de `auto` en const y de referencia tipos
- 22. ¿Es posible crear un ciclo de referencia utilizando solo tipos de valores?
- 23. Tipos de unión y tipos de intersección
- 24. Pasar tipos de referencia por valor en C#
- 25. Tipos de métodos dependientes y clases de tipos
- 26. tipos de contenido diferente AFNetworking AFHTTPClient de éxito y falla
- 27. tipos de palabras clave y de referencia "REF"
- 28. Teoría de tipos: tipos de tipos
- 29. ¿Qué rango de valores pueden almacenar tipos enteros en C++
- 30. Pasar referencias a un constructor C++ y guardarlos en tipos de referencia o no referencia
Él ya te gana! – leppie
Sí, ¡me ganó 46 segundos! Cuando estaba escribiendo mi respuesta, supe que Jon proporcionaría una muy buena respuesta. – Kelsey