String e string em C#: são a mesma coisa ou não? Análise com exemplos
\n\nSe você já escreveu código em C#, certamente notou que strings podem ser declaradas de duas maneiras:
\n\nstring nome = "Ana";\nString saudacao = "Olá!";\n\nE ambas as opções funcionam. Surge uma pergunta legítima: qual a diferença entre string e String em C#? São tipos diferentes? Uma é mais rápida? Ou é apenas uma peculiaridade dos desenvolvedores da linguagem?
\n\nSpoiler: não há diferença. Mas nem tudo é tão simples quanto parece à primeira vista. Vamos entender a fundo, para que você não apenas saiba a resposta para uma pergunta popular do Stack Overflow, mas também entenda por que foi feito assim e qual opção é melhor usar em projetos reais.
\n\nResposta curta: string é um alias para System.String
\n\nEm C#, a palavra-chave string é apenas um alias (apelido) para a classe System.String. Da mesma forma que int é um alias para System.Int32, e bool para System.Boolean.
Quando o compilador vê string, ele automaticamente substitui por System.String. Isso significa que ambas as declarações são compiladas para o mesmo código IL:
// Estas duas linhas são absolutamente idênticas no nível IL\nstring a = "Hello";\nSystem.String b = "World";\n\nSe você abrir um .dll ou .exe compilado através do ILSpy ou dotPeek, não encontrará nenhuma diferença entre essas duas declarações.
\n\nMas por que ambas as opções existem?
\n\nHistoricamente, o C# herdou a sintaxe do C/C++, onde string não é uma palavra-chave, mas sim uma classe. Os desenvolvedores do .NET decidiram adicionar aliases convenientes para que o código parecesse mais natural e familiar para programadores vindos de outras linguagens.
Além disso, os aliases não exigem a importação de namespaces. Para usar String, você precisa adicionar using System; ou escrever o nome completo System.String. Com string, não há esse problema — ele está sempre disponível.
Quando usar string e quando usar String?
\n\nA regra de ouro, seguida pela maioria das equipes e recomendada pela Microsoft na documentação do C#, é:
\n\n- \n
- Use
stringao declarar variáveis, parâmetros de métodos, valores de retorno — em todos os lugares onde a palavra-chave funciona como tipo. \n - Use
Stringapenas ao acessar métodos estáticos da classe (por exemplo,String.IsNullOrEmpty()) ou ao usarSystem.Stringnaqueles raros casos em que você precisa especificar explicitamente o namespace. \n
Por quê? Porque string é uma palavra-chave da linguagem, ela é destacada com cor na IDE e fica imediatamente claro que é uma string. String é apenas o nome de uma classe, e é mais fácil confundi-la com outras classes.
Exemplo de bom estilo
\n\n// Declaração de variável (usamos string)\nstring nomeUsuario = "João";\n\n// Chamada de método estático (usamos String)\nif (String.IsNullOrEmpty(nomeUsuario))\n{\n Console.WriteLine("O nome não pode estar vazio");\n}\n\n// Parâmetro de método (usamos string)\npublic void Saudar(string nome)\n{\n Console.WriteLine($"Olá, {nome}!");\n}\n\nE há diferença de desempenho?
\n\nMuitos desenvolvedores se perguntam: será que string é mais rápida que String? Ou o contrário?
Resposta: não há diferença de desempenho. Nenhuma. Absolutamente. Após a compilação, ambas as opções se transformam no mesmo código IL. O tempo de execu