Qual é a diferença de string vs String em C#?
string é apenas um alias para o tipo String.
Para deixar claro, não há diferença em performance ou forma como o código é gerado. Há exatamente zero diferença no tratamento de ambas. Elas podem fazer as mesmas coisas, e todos os membros estão disponíveis em qualquer um deles, afinal assim se comporta um alias.
Diferenças úteis na utilização e escolha:
-
stringé apenas uma forma mais simples de usar o tipoStringno C#, ou seja,stringé a forma de "tipar" uma cadeia de caracteres no C# eStringé um tipo do CLR. No C#, dependendo do contexto, é melhor usar uma ou outra forma. O tipoStringpresente no namespaceSystempode ser usado em qualquer linguagem que se utilize do CLR. -
stringnão pode ser usado com reflexão.Stringdeve ser usado no lugar. -
Stringpode ser usado para criar outros aliases:using str = System.String; //... str s = "Foi usado outro alias para string."; // a variável 's' é do tipo System.String que é o mesmo que ser stringMas esse é apenas um exemplo, não há necessidade e não é recomendado usar em código real. Existe sim casos que um alias pode ser útil, mas esse apenas dificulta a leitura para quem não está acostumado com isso, sem trazer nenhum benefício.
-
Há alguns locais que ocorre o oposto e criar um alias pode trazer mais legibilidade ao código.
-
Em outros casos pode ser apenas estranho usar um ou outro e dificultar a leitura.
-
Na verdade o tipo
Stringdeve ser usado comoSystem.Stringou onde exista umusing System, enquanto questringpode ser usado em qualquer código que o compilador já entenderá. -
Stringpode ser usado como identificador válido.stringé uma palavra reservada e não pode ser um identificador. -
Há uma diferença na forma como o syntax highlight apresenta ambos. Pois uma forma é tipo e a outra é palavra chave.
-
Apesar da recomendação geral em usar
stringsempre que possível enquanto está programando em C#, há controvérsias no seu uso. Alguns alegam queStringé preferencial para deixar claro, através do Pascal Case, que você está usando um tipo de referência(en).Mas não faz muito sentido porque
Int32é tipo de valor(en) e também usa PascalCase (ou lowerCamelCase). E ainda ele, apesar de ser tipo de referência, tem semântica de valor. Então mesmo que usasse a lógica de Pascal Case para tipo de referência, e Camel Case (ou (UpperCamelCase) para tipo de valor, pela semântica, que é o que importa, ele deveria ser Camel Case, ou seja, deveria começar com minúsculo mesmo.No CLR o estilo de case é usado para ajudar determinar outras características do identificador.
-
É possível substituir o tipo oficial por outro seu com mesmo nome se fizer tudo corretamente. O *alias *apontará para esse novo tipo que tem o mesmo nome e é colocado da mesma forma. Se ele não for exatamente o mesmo nome (incluindo o namespace) aí ele só pode ser usado opcionalmente o que quase inviabiliza o uso real.
Importante lembrar que ele é um tipo como outro qualquer por referência com semântica por valor e algumas facilidades que o compilador dá. O mesmo vale se usar String.
Também vale lembrar que não existe tipo primitivo em C# (outra referência). Isso existe só como conceito do CLR, mesmo assim não como algo fundamental.
Importante notar que tudo isso é válido para o C#, outras linguagens como Java, ou até mesmo VB.NET podem ter mais diferenças.