Middle
¿Cómo se comparan las cadenas en C#? ¿Se comparan las referencias de los objetos de cadena?
sobes.tech AI
Respuesta de la IA
La comparación de cadenas en C# puede realizarse de varias maneras:
- Operador
==: Para literales de cadenas y si las cadenas tienen el mismo contenido, el operador==devolverátrue. A diferencia de otros tipos de referencia, para cadenas el operador==está sobrecargado para comparar el contenido, no las referencias. - Método
Equals(): Este método también compara el contenido de las cadenas por defecto. Se recomienda para una comparación explícita del contenido y puede ser más confiable, especialmente al comparar connull. Hay sobrecargas para tener en cuenta la sensibilidad a mayúsculas/minúsculas y la cultura. - Método
String.Compare(): Método estático que compara dos cadenas y devuelve un valor entero que indica la relación de orden entre ellas. Permite especificar diferentes parámetros de comparación (sensibilidad a mayúsculas/minúsculas, cultura, etc.). - Método
String.CompareOrdinal(): Compara las cadenas byte por byte, sin tener en cuenta las características culturales. - Método
String.CompareTo(): Método de instancia que compara la cadena actual con otra cadena u objeto. Es similar aString.Compare(), pero se llama en un objeto de cadena.
Las referencias de objetos de cadenas no se comparan directamente con el operador == o el método Equals() (sin sobrecarga personalizada) en una comparación de contenido normal. Aunque las cadenas son tipos de referencia, para facilitar su uso, el operador == y el método Equals() están específicamente sobrecargados para comparar exactamente el contenido.
string str1 = "hello";
string str2 = "hello";
string str3 = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });
// Comparación de contenido
Console.WriteLine(str1 == str2); // true (se compara el contenido)
Console.WriteLine(str1.Equals(str2)); // true (se compara el contenido)
Console.WriteLine(str1 == str3); // true (se compara el contenido)
Console.WriteLine(str1.Equals(str3)); // true (se compara el contenido)
// Comparación de referencias (requiere conversión explícita o usar ReferenceEquals)
// En este caso, str1 y str2 pueden referirse al mismo objeto
// debido a la interning de cadenas. str3, probablemente, será un objeto separado.
Console.WriteLine(object.ReferenceEquals(str1, str2)); // puede ser true o false dependiendo del JIT y CLR
Console.WriteLine(object.ReferenceEquals(str1, str3)); // probablemente false