Différence entre "String" et "string" dans .NET et quelle est la meilleure?

15

Dans le .NET Framework, au moins dans le langage C #, nous avons deux "versions" du type chaîne:

  • "chaîne"
  • "Chaîne"

Il semble qu'ils soient interchangeables, mais le sont-ils vraiment? S'ils ne sont pas interchangeables, est-il généralement préférable d'utiliser l'un au lieu de l'autre et dans quelles circonstances?

Cyberherbaliste
la source
1
Semblable à cette question: stackoverflow.com/q/6000517/6504
Agent_9191
2
Sur le plan stylistique, j'ai tendance à utiliser la version en minuscules lorsque je fais référence au type et la version en majuscules lorsque j'appelle une méthode statique de System.String.
Joel Mueller
4
Identique à stackoverflow.com/questions/7074/… .
zzzzBov
2
stringn'existe pas en .net, il n'existe qu'en C #.
CodesInChaos
1
Bien que cela puisse être un peu plus adapté à Stack Overflow, je ne pense pas que ce soit complètement hors sujet pour les programmeurs, et puisque Stack Overflow a déjà au moins un doublon, il ne serait pas très utile de migrer cela. Alors s'il vous plaît, arrêtez de signaler / fermer le vote pour migrer, si vous pensez que cela devrait être fermé, c'est cool, mais il doit être fermé, pas migré.
yannis

Réponses:

30

Eh bien selon le MSDN

string est un alias pour String dans le .NET Framework.

Où "String" est en fait System.String.

Je dirais qu'ils sont interchangeables et qu'il n'y a pas de différence quand et où vous devez utiliser l'un ou l'autre.

Il serait préférable d'être cohérent avec celui que vous avez utilisé.

ChrisF
la source
pour une raison quelconque, je pensais que String était un wrapper de classe autour d'une chaîne de valeur et cela conduit à l'idée de la boxe ... je me trompe totalement ici?
Aaron Anodide
1
@Gabriel Non, String(et donc stringpar alias) sont des types de référence.
Kris Harper
@Gabriel: Java ne fait-il pas cela avec des trucs comme octet contre octet?
whatsisname
La même chose est-elle également vraie pour Double vs double et pour d'autres types de données?
Gavin Coates
1
@AaronAnodide Je pense que c'est une convention Java, c'est probablement là que vous en avez entendu parler.
KChaloux
20

Comme indiqué, ils sont la même chose et ne stringsont qu'un alias String.

Pour ce que ça vaut, j'utilise stringpour déclarer des types - variables, propriétés, valeurs de retour et paramètres. Ceci est cohérent avec l'utilisation d'autres types de système - int, bool, varetc (bien Int32et Booleansont également correctes).

J'utilise Stringlorsque j'utilise les méthodes statiques sur la classe String, comme String.Split()ou String.IsNullOrEmpty(). Je pense que cela a plus de sens car les méthodes appartiennent à une classe et cela est cohérent avec la façon dont j'utilise d'autres méthodes statiques.

Kirk Broadhurst
la source
Nous utilisons également cette convention au travail, et j'aime ça. Mon cerveau établit automatiquement la connexion.
SBI
4

Je suggère d'utiliser des minuscules string. Les majuscules Stringutiliseront la première classe nommée String qu'elle trouve dans les espaces de noms importés ... ce qui est généralement System.String. Il est possible que votre propre classe String soit utilisée à la place.

Bryan Boettcher
la source
3
Si vous avez deux types importés différents avec le même nom et que vous utilisez ce nom sans qualification d'espace de noms, vous obtiendrez une erreur.
svick
Il est possible de tromper Stringen travaillant, il n'est jamais possible de tromper string.
Bryan Boettcher
Pourtant, je ne pense pas que ce soit une raison suffisante pour l'utiliser string.
svick
5
En quoi «on pourrait casser» ou «on ne cassera jamais» alors que tout le reste n'est pas une raison suffisante?
Bryan Boettcher
4

string est un mot clé C # qui est simplement un alias pour le System.String

..mais comme c'est un mot-clé, votre éditeur de coloration syntaxique / IDE l'affichera en couleur de mot-clé, comme int, double, if, else, etc. Stylistiquement, vous préférerez peut-être utiliser le mot-clé plutôt que le System.Stringtype (ou juste Stringaprès vous avez fait using System;).

Ceci est un point de niche si, comme bien bool, char, int, doubleet stringsont tous les alias de mots clés pour les types de système, stringest une étrange-un comme il est un type de référence et les autres sont des types de valeur.

JBRWilkinson
la source
4
objectest aussi un alias de mot-clé pour un type de référence
nikie
Oh oui, j'ai tout oublié - merci pour le rappel.
JBRWilkinson
2

stringn'est qu'un alias String, ils sont finalement les mêmes.

Vous pouvez utiliser celui que vous préférez, bien que je l' utilise généralement stringquand je prévois de l'utiliser un peu comme un type de données primitive (similaire à int, floatou bool) et Stringquand je suis la planification de l'utiliser comme un objet / classe. Par exemple:

string foo = "   ";
if (String.isNullOrWhitespace(foo)) 
{
    // ...
}

Dans le cas ci-dessus, je prévois d'utiliser foosimplement pour stocker du texte (efficacement en tant que primitif), donc j'utilise string; cependant, quand j'appelle String.isNullOrWhitespace(string)j'utilise String. Je le fais, car généralement la première lettre des noms de classe est en majuscule ( String) tandis que la première lettre des primitives (comme int) ne le sont pas.

BBB
la source
-2

La chaîne est utilisée avec l'espace de noms System.String, la chaîne est utilisée pour la spécification du compilateur C #, de plus System.String est la valeur du type de référence. Vous êtes préférable de traiter les objets système, chaîne uniquement à des fins littérales. Le système et le système fonctionnent tous les deux de la même manière.

string TC = new System.String('/', 5);

La chaîne est également utilisée à des fins de comparaison, d'égalité et à d'autres fins.

Anjan Kant
la source
4
cela ne semble rien offrir de substantiel par rapport aux 6 réponses précédentes
gnat