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 tipoString
no 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 tipoString
presente no namespaceSystem
pode ser usado em qualquer linguagem que se utilize do CLR. -
string
não pode ser usado com reflexão.String
deve ser usado no lugar. -
String
pode 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 string
Mas 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
String
deve ser usado comoSystem.String
ou onde exista umusing System
, enquanto questring
pode ser usado em qualquer código que o compilador já entenderá. -
String
pode 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
string
sempre 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.