Sobes.tech
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:

  1. 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.
  2. 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 con null. Hay sobrecargas para tener en cuenta la sensibilidad a mayúsculas/minúsculas y la cultura.
  3. 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.).
  4. Método String.CompareOrdinal(): Compara las cadenas byte por byte, sin tener en cuenta las características culturales.
  5. Método String.CompareTo(): Método de instancia que compara la cadena actual con otra cadena u objeto. Es similar a String.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