Pergunta

Exemplo (observe o caso):

string s = "Hello world!";
String s = "Hello world!";

O que são as diretrizes para o uso de cada um?E quais são os diferenças?

Foi útil?

Solução

string é um alias em C# para System.String.
Então, tecnicamente, não há diferença.É como int vs. System.Int32.

No que diz respeito às diretrizes, geralmente é recomendado usar string sempre que você estiver se referindo a um objeto.

por exemplo.

string place = "world";

Da mesma forma, acho que geralmente é recomendado usar String se você precisar se referir especificamente à classe.

por exemplo.

string greet = String.Format("Hello {0}!", place);

Este é o estilo que a Microsoft tende a usar em seus exemplos.

Parece que a orientação nesta área pode ter mudado, uma vez que EstiloCop agora impõe o uso de aliases específicos do C#.

Outras dicas

Apenas para completar, aqui está um despejo de informações relacionadas...

Como outros observaram, string é um apelido para System.String.Eles compilam no mesmo código, portanto, em tempo de execução, não há diferença alguma.Este é apenas um dos aliases em C#.A lista completa é:

object:  System.Object
string:  System.String
bool:    System.Boolean
byte:    System.Byte
sbyte:   System.SByte
short:   System.Int16
ushort:  System.UInt16
int:     System.Int32
uint:    System.UInt32
long:    System.Int64
ulong:   System.UInt64
float:   System.Single
double:  System.Double
decimal: System.Decimal
char:    System.Char

Além de string e object, os aliases são todos para tipos de valor. decimal é um tipo de valor, mas não um tipo primitivo no CLR.O único tipo primitivo que não possui um alias é System.IntPtr.

Na especificação, os aliases de tipo de valor são conhecidos como "tipos simples".Literais podem ser usados ​​para valores constantes de todos os tipos simples;nenhum outro tipo de valor possui formas literais disponíveis.(Compare isso com VB, que permite DateTime literais e também tem um alias para isso.)

Há uma circunstância em que você ter para usar os apelidos:ao especificar explicitamente o tipo subjacente de uma enumeração.Por exemplo:

public enum Foo : UInt32 {} // Invalid
public enum Bar : uint   {} // Valid

Isso é apenas uma questão de como a especificação define as declarações de enum - a parte após os dois pontos deve ser a tipo integral produção, que é um sinal de sbyte, byte, short, ushort, int, uint, long, ulong, char...em oposição a um tipo produção conforme usado por declarações de variáveis, por exemplo.Não indica nenhuma outra diferença.

Finalmente, quando se trata de qual usar:pessoalmente eu uso os aliases em todos os lugares para a implementação, mas o tipo CLR para qualquer API.Realmente não importa muito o que você usa em termos de implementação - a consistência entre sua equipe é boa, mas ninguém mais vai se importar.Por outro lado, é genuinamente importante que, se você se referir a um tipo em uma API, faça isso de maneira neutra em termos de linguagem.Um método chamado ReadInt32 é inequívoco, enquanto um método chamado ReadInt requer interpretação.O chamador pode estar usando uma linguagem que define um int apelido para Int16, por exemplo.Os designers do framework .NET seguiram esse padrão, com bons exemplos no BitConverter, BinaryReader e Convert Aulas.

String apoia System.String e é um tipo .NET Framework. string é um apelido na linguagem C# para System.String.Ambos são compilados para System.String em IL (Linguagem Intermediária), então não há diferença.Escolha o que você gosta e use isso.Se você codificar em C#, eu preferiria string pois é um alias do tipo C# e bem conhecido pelos programadores C#.

Posso dizer o mesmo sobre (int, System.Int32) etc..

A melhor resposta que já ouvi sobre o uso dos aliases de tipo fornecidos em C# vem de Jeffrey Richter em seu livro CLR via C#.Aqui estão seus 3 motivos:

  • Tenho visto vários desenvolvedores confusos, sem saber se devem usar corda ou Corda em seu código.Como em C# a string (uma palavra-chave) é mapeada exatamente para System.String (um tipo FCL), não há diferença e qualquer uma delas pode ser usada.
  • Em C#, longo mapas para Sistema.Int64, mas em uma linguagem de programação diferente, longo poderia mapear para um Int16 ou Int32.Na verdade, C++/CLI trata o long como um Int32.Alguém lendo o código-fonte em uma linguagem poderia facilmente interpretar mal a intenção do código se estivesse acostumado a programar em uma linguagem de programação diferente.Na verdade, a maioria das línguas nem sequer trata longo como uma palavra-chave e não compilará o código que a utiliza.
  • A FCL possui muitos métodos que possuem nomes de tipos como parte de seus nomes de métodos.Por exemplo, o Leitor Binário type oferece métodos como LerBooleano, ReadInt32, Ler Único, e assim por diante, e o Sistema.Convert type oferece métodos como ParaBooleano, ToInt32, Para solteiro, e assim por diante.Embora seja legal escrever o código a seguir, a linha com float parece pouco natural para mim e não é óbvio que a linha esteja correta:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // OK, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

Então aí está.Acho que todos esses pontos são realmente bons.No entanto, não consigo usar o conselho de Jeffrey em meu próprio código.Talvez eu esteja muito preso ao meu mundo C#, mas acabo tentando fazer com que meu código se pareça com o código do framework.

string é uma palavra reservada, mas String é apenas um nome de classe.Isso significa que string não pode ser usado como um nome de variável por si só.

Se por algum motivo você quisesse uma variável chamada corda, você veria apenas a primeira destas compilações:

StringBuilder String = new StringBuilder();  // compiles
StringBuilder string = new StringBuilder();  // doesn't compile 

Se você realmente deseja um nome de variável chamado corda você pode usar @ como prefixo:

StringBuilder @string = new StringBuilder();

Outra diferença crítica:Stack Overflow os destaca de maneira diferente.

Há uma diferença - você não pode usar String sem using System; antecipadamente.

Foi abordado acima;no entanto, você não pode usar string na reflexão;você deve usar String.

System.String é a classe de string .NET - em C# string é um apelido para System.String - então em uso eles são iguais.

Quanto às diretrizes, eu não ficaria muito atolado e apenas usaria o que você quisesse - há coisas mais importantes na vida e o código será o mesmo de qualquer maneira.

Se você estiver construindo sistemas onde é necessário especificar o tamanho dos números inteiros que você está usando e por isso tende a usar Int16, Int32, UInt16, UInt32 etc.então pode parecer mais natural de usar String - e ao alternar entre diferentes linguagens .net, isso pode tornar as coisas mais compreensíveis - caso contrário, eu usaria string e int.

Eu prefiro o maiúsculo .NET tipos (em vez dos aliases) por motivos de formatação.O .NET os tipos são coloridos da mesma forma que outros tipos de objeto (afinal, os tipos de valor são objetos adequados).

Palavras-chave condicionais e de controle (como if, switch, e return) são minúsculas e coloridas em azul escuro (por padrão).E prefiro não ter divergências no uso e no formato.

Considerar:

String someString; 
string anotherString; 

string e String são idênticos em todos os aspectos (exceto o "S" maiúsculo).De qualquer forma, não há implicações de desempenho.

Minúsculas string é preferido na maioria dos projetos devido ao destaque de sintaxe

C# é uma linguagem usada em conjunto com o CLR.

string é um tipo em C#.

System.String é um tipo no CLR.

Quando você usa C# junto com o CLR string será mapeado para System.String.

Teoricamente, você poderia implementar um compilador C# que gerasse bytecode Java.Uma implementação sensata deste compilador provavelmente mapearia string para java.lang.String para interoperar com a biblioteca de tempo de execução Java.

Este YouTube o vídeo demonstra praticamente como eles diferem.

Mas agora uma longa resposta textual.

Quando falamos sobre .NET há duas coisas diferentes, uma existe .NET framework e o outro existem linguagens ( C# , VB.NET etc) que usam essa estrutura.

enter image description here

"System.String" também conhecido como "String" ("S maiúsculo") é um .NET tipo de dados da estrutura, enquanto "string" é um C# tipo de dados.

enter image description here

Resumindo, "String" é um apelido (a mesma coisa chamada com nomes diferentes) de "string".Portanto, tecnicamente, ambas as instruções de código abaixo fornecerão a mesma saída.

String s = "I am String";

ou

string s = "I am String";

Da mesma forma, existem aliases para outros tipos de dados c#, conforme mostrado abaixo: –

objeto: System.Object, corda: System.String, bool: System.Boolean, byte: System.Byte, byte: System.SByte, curto: System.Int16 e assim por diante

Agora, a pergunta de um milhão de dólares do ponto de vista do programador. Então, quando usar "String" e "string"?

A primeira coisa para evitar confusão é usar um deles de forma consistente.Mas, do ponto de vista das práticas recomendadas, quando você faz a declaração de variáveis, é bom usar "string" ( "s" minúsculo) e quando você o usa como nome de classe, então "String" ( "S" maiúsculo) é o preferido.

No código abaixo, o lado esquerdo é uma declaração de variável e é declarada usando "string".No lado direito estamos chamando um método para que "String" seja mais sensato.

string s = String.ToUpper() ;

Minúsculas string é um apelido para System.String.Eles são iguais em C#.

Há um debate sobre se você deve usar os tipos System (System.Int32, System.String, etc.) tipos ou o C# aliases (int, string, etc).Eu pessoalmente acredito que você deveria usar o C# aliases, mas essa é apenas minha preferência pessoal.

string é apenas um apelido para System.String.O compilador irá tratá-los de forma idêntica.

A única diferença prática é o destaque de sintaxe conforme você mencionou, e que você deve escrever using System se você usar String.

Ambos são iguais.Mas do ponto de vista das diretrizes de codificação, é melhor usar string em vez de String.Isso é o que geralmente os desenvolvedores usam.por exemplo.ao invés de usar Int32 nós usamos int como int é alias para Int32

FYI “A sequência de palavras -chave é simplesmente um alias para a classe predefinida System.String. ” - C# Especificação de idioma 4.2.3http://msdn2.microsoft.com/En-US/library/aa691153.aspx

Como os outros estão dizendo, eles são iguais.As regras do StyleCop, por padrão, obrigarão você a usar string como uma prática recomendada de estilo de código C#, exceto ao fazer referência System.String funções estáticas, como String.Format, String.Join, String.Concat, etc...

Nova resposta após 6 anos e 5 meses (procrastinação).

Enquanto string é uma palavra-chave C# reservada que sempre tem um significado fixo, String é apenas um comum identificador que pode se referir a qualquer coisa.Dependendo dos membros do tipo atual, o namespace atual e o aplicado using diretivas e sua colocação, String pode ser um valor ou um tipo distinto de global::System.String.

Darei dois exemplos onde using directivas não vão ajudar.


Primeiro, quando String é um valor do tipo atual (ou uma variável local):

class MySequence<TElement>
{
  public IEnumerable<TElement> String { get; set; }

  void Example()
  {
    var test = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
  }
}

O acima não será compilado porque IEnumerable<> não tem um membro não estático chamado Format, e nenhum método de extensão se aplica.No caso acima, ainda pode ser possível usar String em outros contextos onde um tipo é a única possibilidade sintaticamente.Por exemplo String local = "Hi mum!"; pode estar OK (dependendo do namespace e using diretivas).

Pior:Ditado String.Concat(someSequence) provavelmente (dependendo usings) vá para o método de extensão Linq Enumerable.Concat.Não irá para o método estático string.Concat.


Em segundo lugar, quando String é outro tipo, aninhado dentro do tipo atual:

class MyPiano
{
  protected class String
  {
  }

  void Example()
  {
    var test1 = String.Format("Hello {0}.", DateTime.Today.DayOfWeek);
    String test2 = "Goodbye";
  }
}

Nenhuma das declarações no Example método compila.Aqui String é sempre um piano corda, MyPiano.String.Nenhum membro (static ou não) Format existe nele (ou é herdado de sua classe base).E o valor "Goodbye" não pode ser convertido nele.

O uso de tipos System facilita a portabilidade entre C# e VB.Net, se você gosta desse tipo de coisa.

Contra o que parece ser uma prática comum entre outros programadores, prefiro String sobre string, apenas para destacar o fato de que String é um tipo de referência, como Jon Skeet mencionou.

string é um apelido (ou abreviatura) de System.String.Isso significa que, digitando string queríamos dizer System.String.Você pode ler mais no link think: 'string' é um alias/abreviação de System.String.

Corda (System.String) é uma classe na biblioteca de classes base.string (minúsculas) é um trabalho reservado em C# que é um alias para System.String.Int32 vs int é uma situação semelhante a Boolean vs. bool.Essas palavras-chave específicas da linguagem C# permitem declarar primitivas em um estilo semelhante ao C.

Gostaria apenas de adicionar isto à resposta do lfousts, do livro de Ritchers:

A especificação do idioma C# afirma: "Por uma questão de estilo, o uso da palavra -chave é favorecido pelo uso do nome completo do tipo de sistema". Não concordo com a especificação do idioma;Prefiro usar os nomes do tipo FCL e evitar completamente os nomes do tipo primitivo.Na verdade, desejo que os compiladores nem ofereçam nomes de tipos primitivos e desenvolvedores forçados a usar os nomes do tipo FCL.Aqui estão meus motivos:

  • Tenho visto vários desenvolvedores confusos, sem saber se devem usar cordaou Corda em seu código.Porque em C# corda (uma palavra-chave) mapeia exatamente para System.String (um tipo FCL), não há diferença e qualquer um pode ser usado.Da mesma forma, ouvi alguns desenvolvedores dizerem que interno Representa um número inteiro de 32 bits quando o aplicativo está em execução em um sistema operacional de 32 bits e representa um número inteiro de 64 bits quando o aplicativo está em execução em um sistema operacional de 64 bits.Esta afirmação é absolutamente falsa:em C#, um interno sempre mapeia Sistema.Int32, e, portanto, representa um número inteiro de 32 bits, independentemente do sistema operacional que o código está em execução.Se os programadores usassem Int32 Em seu código, essa confusão potencial também é eliminada.

  • Em C#, longo mapas para Sistema.Int64, mas em uma linguagem de programação diferente, longopoderia mapear para um Int16 ou Int32.Na verdade, C++/CLI trata longo como um Int32.Alguém lendo o código -fonte em um idioma poderia facilmente interpretar mal a intenção do Código se ele estivesse acostumado a programar em uma linguagem de programação diferente.Na verdade, a maioria das línguas nem sequer trata longo Como palavra -chave e não compilará o código que o usa.

  • A FCL possui muitos métodos que possuem nomes de tipos como parte de seus nomes de métodos.Por exemplo, o Leitor Binário type oferece métodos como LerBooleano, ReadInt32, Ler Único, e assim por diante, e o Sistema.Convert type oferece métodos como ParaBooleano, ToInt32, Para solteiro, e assim por diante.Embora seja legal escrever o seguinte código, a linha com flutuador Parece muito antinatural para mim, e não é óbvio que a linha está correta:

    BinaryReader br = new BinaryReader(...);
    float val = br.ReadSingle(); // OK, but feels unnatural
    Single val = br.ReadSingle(); // OK and feels good
    
  • Muitos programadores que usam C# tendem exclusivamente a esquecer que outras linguagens de programação podem ser usadas em relação ao CLR e, por isso, C# -mss entram no código da biblioteca de classes.Por exemplo, o FCL da Microsoft está quase exclusivamente escrito em C# e os desenvolvedores da equipe da FCL agora introduziram métodos na biblioteca como Variedadeé Obter comprimento longo, que retorna um Int64 valor que é um longo em C#, mas não em outros idiomas (como C ++/CLI).Outro exemplo é System.Linq.Enumerableé Contagem longa método.

Não recebi a opinião dele antes de ler o parágrafo completo.

String não é uma palavra-chave e pode ser usada como identificador, enquanto string é uma palavra-chave e não pode ser usada como identificador.E do ponto de vista funcional ambos são iguais.

Chegando atrasado para a festa:Eu uso os tipos CLR 100% do tempo (bem, exceto se forçado para usar o tipo C#, mas não me lembro quando foi a última vez).

Comecei a fazer isso originalmente anos atrás, de acordo com os livros CLR de Ritchie.Fazia sentido para mim que todas as linguagens CLR tivessem que ser capazes de suportar o conjunto de tipos CLR, portanto, usar os tipos CLR fornece um código mais claro e possivelmente mais "reutilizável".

Agora que faço isso há anos, é um hábito e gosto da coloração que o VS mostra para os tipos CLR.

A única desvantagem real é que o preenchimento automático usa o tipo C#, então acabo redigitando os tipos gerados automaticamente para especificar o tipo CLR.

Além disso, agora, quando vejo "int" ou "string", parece muito errado para mim, como se estivesse olhando para o código C dos anos 1970.

É uma questão de convenção, na verdade. string apenas se parece mais com o estilo C/C++.A convenção geral é usar quaisquer atalhos fornecidos pelo idioma escolhido (int/Int para Int32).Isso vale para "objeto" e decimal também.

Teoricamente, isso poderia ajudar a portar o código para algum padrão futuro de 64 bits, no qual "int" poderia significar Int64, mas esse não é o ponto, e eu esperaria que qualquer assistente de atualização alterasse qualquer int referências a Int32 de qualquer maneira, apenas por segurança.

Não há diferença.

A palavra-chave C# string mapeia para o tipo .NET System.String - é um apelido que segue as convenções de nomenclatura do idioma.

De forma similar, int mapas para System.Int32.

Há uma citação sobre esse assunto de Livro de Daniel Solis.

Todos os tipos predefinidos são mapeados diretamente para os tipos .NET subjacentes.Os nomes de tipo C# (string) são simplesmente aliases para os tipos .NET (string ou system.string); portanto, o uso dos nomes .NET funciona bem sintaticamente, embora isso seja desencorajado.Dentro de um programa C#, você deve usar os nomes C# em vez dos nomes .NET.

corda é uma palavra-chave e você não pode usar string como identificador.

Corda não é uma palavra-chave e você pode usá-la como identificador:

Exemplo

string String = "I am a string";

A palavra-chave string é um apelido para System.String Além da questão das palavras -chave, os dois são exatamente equivalentes.

 typeof(string) == typeof(String) == typeof(System.String)

Sim, não há diferença entre eles, assim como o bool e Boolean.

Não há diferença entre os dois - string, no entanto, parece ser a opção preferida ao considerar o código-fonte de outros desenvolvedores.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top