Sobes.tech
Middle

Como é que a comparação de strings funciona em C#? As referências dos objetos de string são comparadas?

sobes.tech IA

Resposta da IA

A comparação de strings em C# pode ocorrer de várias formas:

  1. Operador ==: Para literais de strings e se as strings tiverem o mesmo conteúdo, o operador == retornará true. Ao contrário de outros tipos de referência, para strings, o operador == é sobrecarregado para comparar o conteúdo, não as referências.
  2. Método Equals(): Este método também compara o conteúdo das strings por padrão. É recomendado para uma comparação explícita de conteúdo e pode ser mais confiável, especialmente ao comparar com null. Existem sobrecargas para considerar a sensibilidade a maiúsculas/minúsculas e cultura.
  3. Método String.Compare(): Método estático que compara duas strings e retorna um valor inteiro indicando a relação de ordem entre elas. Permite especificar diferentes parâmetros de comparação (sensibilidade a maiúsculas/minúsculas, cultura, etc.).
  4. Método String.CompareOrdinal(): Compara as strings byte por byte, sem considerar as características culturais.
  5. Método String.CompareTo(): Método de instância que compara a string atual com outra string ou objeto. É semelhante a String.Compare(), mas é chamado em um objeto de string.

As referências de objetos de strings não são comparadas diretamente com o operador == ou o método Equals() (sem sobrecarga personalizada) em uma comparação de conteúdo normal. Embora as strings sejam tipos de referência, para facilitar seu uso, o operador == e o método Equals() estão especificamente sobrecarregados para comparar exatamente o conteúdo.

string str1 = "hello";
string str2 = "hello";
string str3 = new string(new char[] { 'h', 'e', 'l', 'l', 'o' });

// Comparação de conteúdo
Console.WriteLine(str1 == str2);           // true (compara o conteúdo)
Console.WriteLine(str1.Equals(str2));    // true (compara o conteúdo)
Console.WriteLine(str1 == str3);           // true (compara o conteúdo)
Console.WriteLine(str1.Equals(str3));    // true (compara o conteúdo)

// Comparação de referências (requer conversão explícita ou uso de ReferenceEquals)
// Neste caso, str1 e str2 podem referir-se ao mesmo objeto
// devido à interning de strings. str3, provavelmente, será um objeto separado.
Console.WriteLine(object.ReferenceEquals(str1, str2)); // pode ser true ou false dependendo do JIT e CLR
Console.WriteLine(object.ReferenceEquals(str1, str3)); // provavelmente false