93 votes

Ne peut pas utiliser des chaînes de caractères.Vide comme valeur par défaut pour un paramètre facultatif en C# - alors quel est le point?

Je suis de lecture Efficace C# par le projet de Loi Wagner. Dans la Rubrique 14 - Réduire au minimum la Double Logique d'Initialisation, il montre l'exemple suivant en utilisant la nouvelle option fonction de paramètres dans un constructeur:

public MyClass(int initialCount = 0, string name = "")

De l'avis qu'il a utilisé "" au lieu de string.Empty.
Il commente:

Vous remarquerez [dans l'exemple ci-dessus] que le deuxième constructeur spécifié "" pour la valeur par défaut sur le nom du paramètre, plutôt que le plus habituel, string.Empty. C'est parce qu' string.Empty n'est pas une constante de compilation. C'est une propriété statique définie dans la classe string. Parce que ce n'est pas une constante de compilation, vous ne pouvez pas l'utiliser pour la valeur par défaut pour un paramètre.

Si nous ne pouvons pas utiliser l' string.Empty statique dans toutes les situations, puis n'est-ce pas que la défaite de l'objectif? Je pensais que nous allions utiliser pour être sûr que nous avons un système indépendant de moyens de se référer à la chaîne vide. Est ma compréhension de mal? Merci.

Mise à JOUR
Vient un suivi des commentaires. Selon MSDN:

Chaque paramètre a une valeur par défaut dans le cadre de sa définition. Si aucun argument n'est transmis pour ce paramètre, la valeur par défaut est utilisée. Valeurs par défaut doivent être constantes.

Alors nous ne sommes pas en mesure de les utiliser System.Environment.NewLine soit, ou de l'utilisation nouvellement instancié objets de valeurs par défaut. Je n'ai pas utilisé VS2010 encore, et c'est décevant!

69voto

Andy Mortimer Points 1889

Que du C# 2.0 compilateur, il y a très peu de point de String.Empty de toute façon, et en fait, dans de nombreux cas, c'est un pessimisation, car le compilateur peut inline quelques références à "" mais ne peut pas faire la même chose avec String.Empty.

En C# 1.1, il est utile pour éviter de créer des lots d'objets indépendants qui contiennent la chaîne de caractères vide, mais ces jours sont révolus. "" fonctionne très bien.

56voto

Il n'y a rien pour vous empêcher de définir votre propre constant pour la chaîne vide si vous voulez vraiment l'utiliser comme une valeur de paramètre facultatif:

const string String_Empty = "";

public static void PrintString(string s = String_Empty)
{
    Console.WriteLine(s);
}

[En aparté, une raison de préférer String.Empty sur "" en général, qui n'a pas été mentionné dans les autres réponses, c'est qu'il y a de divers caractères Unicode (zéro-largeur de menuisiers, etc.) qui sont effectivement invisible à l'œil nu. Donc, quelque chose qui ressemble "" n'est pas nécessairement la chaîne vide, alors qu'avec String.Empty vous savez exactement ce que vous êtes en utilisant. Je reconnais que ce n'est pas une source commune de bugs, mais c'est possible.]

26voto

Jon Skeet Points 692016

À partir de la question d'origine:

Je pensais que nous allions utiliser pour être sûr que nous avons un système indépendant de moyens de se référer à la chaîne vide.

Peut-elle à la chaîne vide varier d'un système à l'autre? C'est toujours une chaîne de n caractères! Je serais vraiment peur si jamais je trouve une oeuvre string.Empty == "" retourné false :) C'est pas le même que quelque chose comme Environment.NewLine.

De Contre-Terrorisme du bounty post:

Je veux de la Chaîne.Vide peut être utilisé en tant que paramètre par défaut dans la prochaine C# version. :D

Eh bien, c'est certainement ne va pas arriver.

Alors que je n'ai personnellement aimé, très différente de mécanisme défaillant de trop, la façon dont les paramètres facultatifs de travail a été dans .NET depuis le début - et c'est toujours l'incorporation d'une constante dans les métadonnées, ainsi que le code appelant pouvez le copier constante dans le site d'appel, si aucun argument correspondant est fourni.

Avec string.Empty il est vraiment inutile - à l'aide d' "" à faire ce que vous voulez; est-ce que pénible à utiliser la chaîne de caractères littérale? (J'utilise le littéral partout - je n'ai jamais utiliser string.Empty - mais c'est un autre argument.)

C'est ce qui me surprend sur cette question - la plainte tourne autour de quelque chose qui n'a pas réellement de causer un réel problème. Il est de plus important dans le cas où vous souhaitez que la valeur par défaut est calculée au moment de l'exécution, car il peut en fait varier. Par exemple, je pourrais imaginer des cas où vous voulez être en mesure d'appeler une méthode avec un DateTime paramètre et ont une valeur par défaut à "l'heure actuelle". Pour le moment, la seule vaguement élégante solution de contournement que je sais c'est:

public void RecordTime(string message, DateTime? dateTime = null)
{
    var realDateTime = dateTime ?? DateTime.UtcNow;
}

... mais ce n'est pas toujours approprié.

En conclusion:

  • Je doute fort que cela ne sera jamais une partie de C#
  • Pour string.Empty il est inutile de toute façon
  • Pour les autres valeurs qui vraiment ne pas toujours avoir la même valeur, il est vraiment peut être une douleur

7voto

ho1 Points 31752

Je n'ai jamais utiliser des chaînes de caractères.Vide, je ne vois pas le point. Peut-être que c'est plus facile pour les gens qui sont vraiment nouveau dans la programmation, mais je doute que c'est utile même pour que.

4voto

Tom Cabanski Points 4952

Je pense que l'idée derrière la chaîne.Vide est-il améliore la lisibilité. Ce n'est pas de retour à la ligne où il y a une différence entre la façon dont il est représenté sur les différentes plates-formes. C'est de la honte, il ne peut pas être utilisé dans un paramètre par défaut. Toutefois, il ne sera pas causer des problèmes si vous port entre Windows et quelque chose comme Mono sous Linux.

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