7005 votes

Quelle est la différence entre la Chaîne et la chaîne?

En C#, quelle est la différence entre String et string? (note le cas)

Exemple:

string s = "Hello, World";

String S = "Hello, World";

Aussi, quelles sont les lignes directrices pour l'utilisation de chacun?

6583voto

Derek Park Points 25025

string est un alias pour System.String. Donc, techniquement, il n'y a pas de différence. C'est comme int vs System.Int32.

Aussi loin que les lignes directrices, je pense qu'il est généralement recommandé d'utiliser string tout moment vous faites référence à un objet.

par exemple, string place = "world";

De même, je pense qu'il est généralement recommandé d'utiliser String si vous avez besoin de se référer spécifiquement à la classe.

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

C'est le style que Microsoft a tendance à l'utiliser dans leurs exemples.


Il semble que les orientations dans ce domaine peuvent avoir changé, comme StyleCop maintenant, impose l'utilisation de C#spécifiques des alias.

3644voto

Jon Skeet Points 692016

Juste par souci d'exhaustivité, voici un brain dump de l'information connexe...

Comme d'autres l'ont noté, string est un alias pour System.String. Ils compiler le même code, donc au moment de l'exécution il n'y a pas de différence que ce soit. Ceci est juste l'un des pseudonymes en C#. La liste complète est:

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

Hormis string, object, les alias sont tous des types de valeur. decimal est un type de valeur, mais pas un type primitif dans le CLR. Le seul type primitif qui n'a pas d'alias est - System.IntPtr.

Dans la spécification, la valeur de type alias sont connus comme des "types simples". Les littéraux peuvent être utilisés pour des valeurs constantes de chaque type simple; pas d'autres types de valeurs ont littérale des formulaires disponibles. (A comparer avec VB, ce qui permet d' DateTime littéraux, et a un alias pour elle aussi.)

Il est une circonstance dans laquelle vous avez à utiliser les alias: quand spécifiant explicitement un enum type sous-jacent. Par exemple:

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

Enfin, quand il s'agit de: personnellement, j'utilise l'alias de partout pour la mise en œuvre, mais le type CLR pour les Api. Il vraiment n'importe pas trop lequel vous utilisez en termes de mise en œuvre, la cohérence entre votre équipe est sympa, mais personne d'autre est d'aller aux soins. D'autre part, il est vraiment important que si vous vous référez à un type dans une API, vous le faites dans une langue neutre. Une méthode appelée ReadInt32 est sans ambiguïté, tandis qu'une méthode appelée ReadInt nécessite une interprétation. L'appelant pouvait être l'aide d'un langage qui définit un int alias Int16, par exemple. L' .NET framework concepteurs ont suivi ce modèle, de bons exemples dans l' BitConverter, BinaryReader et Convert les classes.

772voto

artur02 Points 3533

String représente System.String et il est un .NET Framework type. string est un alias dans le langage C# pour System.String. Deux d'entre eux sont compilées System.String IL (Intermediate Language), donc il n'y a pas de différence. Choisir ce que vous aimez et l'utiliser. Si tu code en C#, je préfère string que c'est un type C# alias et bien connu par C#, programmeurs.

Je peux dire la même chose (int, System.Int32) etc..

546voto

Luke Foust Points 1529

La meilleure réponse que j'ai jamais entendu parler de l'aide du type d'alias en C# vient d'Jeffrey Richter dans son livre CLR Via C#. Voici ses 3 raisons:

  • J'ai vu un certain nombre de développeurs confuse, ne sachant pas si l'utilisation de la chaîne ou Chaîne dans leur code. Parce qu'en C# la chaîne de caractères (un mot-clé) cartes exactement à ce Système.Chaîne (FCL), il n'y a pas de différence et peuvent être utilisés.
  • En C#, le long des cartes de Système.Int64, mais dans un autre langage de programmation, longue pourrait correspondre à une Int16 ou Int32. En fait, C++/CLI n'est en fait traiter long comme un Int32. Quelqu'un de lire le code source dans un langage facilement mal interpréter le code de l'intention, si il ou elle ont été utilisés pour la programmation dans un autre langage de programmation. En fait, la plupart des langues n'a même pas de traiter long comme un mot-clé et de ne pas compiler le code qui l'utilise.
  • Le FCL a beaucoup de méthodes qui ont des noms de type dans le cadre de leurs noms de méthode. Par exemple, le BinaryReader offre des méthodes telles que ReadBoolean, ReadInt32, ReadSingle, et ainsi de suite, et le Système.Convertir offre des méthodes telles que ToBoolean, ToInt32, ToSingle, et ainsi de suite. Même si c'est légal d'écrire le code suivant, la ligne avec flotteur se sent très naturelle pour moi, et il n'est pas évident que la ligne est correcte:
BinaryReader br = new BinaryReader(...);
float val  = br.ReadSingle(); // Ok, but feels unnatural
Single val = br.ReadSingle(); // OK and feels good

Donc là vous l'avez. Je pense que ce sont vraiment de bons points. J'ai cependant, de ne pas me retrouver à l'aide de Jeffrey conseils dans mon propre code. Peut-être que je suis trop coincé dans mon C# monde, mais je finis par essayer de faire de mon code ressemble le code de la structure.

489voto

Simon_Weaver Points 31141

la chaîne est un mot réservé, mais la Chaîne est juste un nom de classe. Cela signifie que 'string' ne peut pas être utilisé comme un nom de variable par lui-même.

Si pour certaines raisons vous avez voulu une variable appelée chaîne, vous verriez que la première de ces compile:

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

Si vous voulez vraiment un nom de variable appelée 'string', vous pouvez utiliser @ comme préfixe :

StringBuilder @string = new StringBuilder();

Une autre différence essentielle : Stackoverflow les met en valeur différemment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X