Je lis Effective C # de Bill Wagner. Dans l' élément 14 - Minimiser la logique d'initialisation en double , il montre l'exemple suivant d'utilisation de la nouvelle fonctionnalité de paramètres facultatifs dans un constructeur:
public MyClass(int initialCount = 0, string name = "")
Notez qu'il a utilisé à la ""
place de string.Empty
.
Il commente:
Vous noterez [dans un exemple ci-dessus] que le deuxième constructeur a spécifié "" pour la valeur par défaut sur le paramètre de nom , plutôt que la plus habituelle
string.Empty
. C'est parce que cestring.Empty
n'est pas une constante de compilation. C'est une propriété statique définie dans la classe de chaînes. Étant donné qu'il ne s'agit pas d'une constante de compilation, vous ne pouvez pas l'utiliser pour la valeur par défaut d'un paramètre.
Si nous ne pouvons pas utiliser la string.Empty
statique dans toutes les situations, cela ne va-t-il pas à l'encontre de son objectif? J'ai pensé que nous l'utiliserions pour être sûrs d'avoir un moyen indépendant du système de faire référence à la chaîne vide. Ma compréhension est-elle erronée? Merci.
MISE
À JOUR Juste un commentaire de suivi. Selon MSDN:
Chaque paramètre facultatif a une valeur par défaut dans le cadre de sa définition. Si aucun argument n'est envoyé pour ce paramètre, la valeur par défaut est utilisée. Les valeurs par défaut doivent être des constantes.
Ensuite, nous ne pouvons pas utiliser System.Environment.NewLine
ni l'un ni l'autre, ni utiliser des objets nouvellement instanciés comme valeurs par défaut. Je n'ai pas encore utilisé VS2010, et c'est décevant!
la source
Réponses:
À partir du compilateur C # 2.0, il y a très peu d'intérêt de
String.Empty
toute façon, et en fait, dans de nombreux cas, c'est une pessimisation, puisque le compilateur peut intégrer certaines références à""
mais ne peut pas faire de même avecString.Empty
.En C # 1.1, il était utile d'éviter de créer de nombreux objets indépendants contenant tous la chaîne vide, mais ces jours sont révolus.
""
fonctionne très bien.la source
Rien ne vous empêche de définir votre propre constante pour la chaîne vide si vous voulez vraiment l'utiliser comme valeur de paramètre facultative:
[En aparté, l' une des raisons de préférer
String.Empty
plus""
en général, qui n'a pas été mentionné dans les autres réponses, est qu'il ya différents caractères Unicode (joiners zéro largeur, etc.) qui sont effectivement invisibles à l'œil nu. Donc, quelque chose qui ressemble""
n'est pas nécessairement la chaîne vide, alors qu'avecString.Empty
vous savez exactement ce que vous utilisez. Je reconnais que ce n'est pas une source courante de bogues, mais c'est possible.]la source
De la question d'origine:
De quelle manière la chaîne vide peut-elle varier d'un système à l'autre? C'est toujours une chaîne sans caractères! J'aurais vraiment peur si jamais je trouvais une implémentation
string.Empty == ""
retournée false :) Ce n'est pas la même chose que quelque chose commeEnvironment.NewLine
.Extrait du message sur les primes de Counter Terrorist:
Eh bien, cela n'arrivera certainement pas.
Bien que j'aurais personnellement aimé un mécanisme par défaut très différent aussi, la façon dont les paramètres optionnels fonctionnent est dans .NET depuis le début - et cela signifie toujours incorporer une constante dans les métadonnées, afin que le code appelant puisse copier cette constante dans l'appel site si aucun argument correspondant n'est fourni.
Avec
string.Empty
c'est vraiment inutile - utiliser""
fera ce que vous voulez; est-ce si pénible d'utiliser la chaîne littérale? (J'utilise le littéral partout - je n'utilise jamaisstring.Empty
- mais c'est un argument différent.)C'est ce qui me surprend dans cette question - la plainte tourne autour de quelque chose qui ne pose pas vraiment de problème. C'est plus important dans les cas où vous souhaitez que la valeur par défaut soit calculée au moment de l'exécution, car elle peut en fait varier. Par exemple, je pourrais imaginer des cas où vous souhaitez pouvoir appeler une méthode avec un
DateTime
paramètre et la définir par défaut sur "l'heure actuelle". Pour le moment, la seule solution de contournement vaguement élégante que je connaisse est:... mais ce n'est pas toujours approprié.
En conclusion:
string.Empty
c'est inutile de toute façonla source
Environment.Newline
.. La seule chose qui manque dans votre exemple serait une vérification de la variable pour null, et renvoyer une exception au développeur lui disant que même si elle est nullable, c'est pas accepté.if(dateTime == null){ throw new ArgumentException("The dateTime parameter must be set. Nullable type used for device independent variable set.");}
ou quelque chose comme ça. Mais j'aime vraiment ça! Y a-t-il d'autres mises en garde pour le faire à votre façon?Je n'utilise jamais de chaîne, vide, je n'en vois pas l'intérêt. Peut-être que cela facilite les choses pour les personnes qui sont vraiment novices en programmation, mais je doute que ce soit utile même pour cela.
la source
""
et" "
, mais je ne peux pas dire que" "
c'est si courant.Je pense que l'idée derrière string.Empty est qu'elle améliore la lisibilité. Ce n'est pas comme une nouvelle ligne où il y a une différence entre la façon dont elle est représentée sur différentes plates-formes. C'est dommage qu'il ne puisse pas être utilisé dans un paramètre par défaut. Cependant, cela ne posera aucun problème si vous portez entre Windows et quelque chose comme Mono sous Linux.
la source
String.Empty
plus lisible. . . personnellement cependant, je pense que c'est un peu dingue.""
est probablement la chaîne la plus courante et tout le monde l'a vue un milliard de fois, alors comment est-elle illisible?String.Empty
est à peu près aussi utile que s'il y avait un fichierInt32.Zero
.En tant que FYI, il semble que la même contrainte soit imposée aux valeurs transmises aux constructeurs d'attributs - elles doivent être constantes. Puisque string.empty est défini comme:
plutôt qu'une constante réelle, elle ne peut pas être utilisée.
la source
J'utilise
string.Empty
uniquement pour la lisibilité.Si quelqu'un d'autre a besoin de lire / modifier mon code plus tard, il sait que je voulais vérifier ou définir quelque chose sur une chaîne vide. Utiliser juste
""
peut parfois causer des bugs et de la confusion parce que j'ai peut-être oublié de mettre la chaîne que je voulais.Par exemple:
contre
La première
if
déclaration me semble tellement plus délibérée et lisible. Parce que ce n'est qu'une préférence cependant, je ne vois vraiment pas le train-smash d'avoir à utiliser""
au lieu destring.Empty
.la source
La meilleure solution à ce problème est peut-être une surcharge de cette méthode, de cette manière:
la source