2012-10-29 3 views
1

J'ai des littéraux vraiment longs dans mon application. Est-il différent de les définir dans une méthode comme:Bonne manière pour les littéraux de chaîne

public string DoSomething() 
{ 
    string LongString = "..."; 
    // ... 
} 

ou comme un champ const dans la lass comme:

private const string LongString = "..."; 

public string DoSomething() 
{ 
    // ... 
} 

La méthode DoSomething() sera appelé beaucoup de fois, est le LongString créé et détruit chaque fois si je le définis dans la méthode, ou le compilateur prend soin?

+1

Un choix purement stylistique. Aucun effet sur la performance. – CodesInChaos

+1

Aussi, si vous ne le savez pas, quand il s'agit d'une chaîne longue, le symbole '@' est inestimable. – MikeTheLiar

+0

Porte numéro 3 est en faire une propriété publique. – Paparazzi

Répondre

0

Il n'y a pas de différence entre les deux, la chaîne ne sera pas créée et détruite plusieurs fois dans la méthode. .NET utilise string interning, donc les littéraux de chaînes distincts ne sont définis qu'une seule fois.

+1

* Les littéraux de chaînes * ne sont créés qu'une seule fois. Les chaînes créées à l'exécution ne sont pas (par défaut) internées. – Servy

+0

Dans le premier exemple de l'OP, la variable LongString ne référencerait-elle pas la valeur dans la table interne? – MattDavey

+0

Ce serait, et c'est parce qu'il se réfère à une chaîne littérale dans ce cas. Mon point est que, bien que l'internalisation s'applique certainement ici, cela ne signifie pas que chaque chaîne est toujours internée. Dans d'autres situations, vous pouvez avoir deux chaînes différentes qui ne sont pas réellement des références au même tableau char sous-jacent. – Servy

0

Dans votre premier exemple, il ne serait disponible que dans la fonction. Dans votre seconde, il serait disponible pour d'autres fonctions dans cette même classe.

2

Les littéraux de chaîne obtiennent interned par le CLR. Signifiant effectivement qu'ils ne seront créés qu'une seule fois.

Questions connexes