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:
- 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. - 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 comnull. Existem sobrecargas para considerar a sensibilidade a maiúsculas/minúsculas e cultura. - 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.). - Método
String.CompareOrdinal(): Compara as strings byte por byte, sem considerar as características culturais. - Método
String.CompareTo(): Método de instância que compara a string atual com outra string ou objeto. É semelhante aString.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