Impossible d’utiliser Ssortingng.Empty comme valeur par défaut pour un paramètre facultatif

Je lis effective C # par 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 parameters facultatifs dans un constructeur:

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

Notez qu’il a utilisé "" au lieu de ssortingng.Empty .
Il commente:

Vous noterez [dans un exemple ci-dessus] que le second constructeur a spécifié “” pour la valeur par défaut du paramètre name , plutôt que la ssortingng.Empty plus habituelle. ssortingng.Empty . C’est parce que ssortingng.Empty n’est pas une constante à la compilation. C’est une propriété statique définie dans la classe de chaîne. Comme 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 ssortingng.Empty statique dans toutes les situations, alors cela ne va-t-il pas à l’ ssortingng.Empty du but? Je pensais que nous l’utiliserions pour nous assurer que nous avons un moyen indépendant du système de faire référence à la chaîne vide. Est-ce que ma compréhension est mauvaise? Merci.

METTRE À 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.

Nous ne pouvons pas non plus utiliser System.Environment.NewLine ou utiliser des objects nouvellement instanciés comme valeurs par défaut. Je n’ai pas encore utilisé VS2010, et c’est décevant!

En ce qui concerne le compilateur C # 2.0, Ssortingng.Empty , et dans de nombreux cas, il s’agit d’une pessimisation, car le compilateur peut incorporer certaines références à "" mais ne peut pas faire la même chose avec Ssortingng.Empty .

En C # 1.1, il était utile d’éviter de créer beaucoup d’objects indépendants contenant tous la chaîne vide, mais ces jours sont révolus. "" fonctionne bien.

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:

 const ssortingng Ssortingng_Empty = ""; public static void PrintSsortingng(ssortingng s = Ssortingng_Empty) { Console.WriteLine(s); } 

[En passant, une des raisons de préférer Ssortingng.Empty sur "" en général, qui n’a pas été mentionné dans les autres réponses, est qu’il existe différents caractères Unicode (menuisiers sans largeur, etc.) qui sont effectivement invisibles pour l’oeil nu. Donc, quelque chose qui ressemble à "" n’est pas nécessairement la chaîne vide, alors qu’avec Ssortingng.Empty vous savez exactement ce que vous utilisez. Je reconnais que ce n’est pas une source commune de bogues, mais c’est possible.]

De la question initiale:

Je pensais que nous l’utiliserions pour nous assurer que nous avons un moyen indépendant du système de faire référence à la chaîne vide.

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! Je serais vraiment effrayé si je trouvais une implémentation où ssortingng.Empty == "" false 🙂 Ce n’est pas la même chose que Environment.NewLine .

Du poteau de prime de Counter Terrorist:

Je veux Ssortingng.Empty peut être utilisé comme paramètre par défaut dans la prochaine version de C #. :RÉ

Eh bien, ça ne va certainement pas arriver.

Bien que j’aurais personnellement aimé un mécanisme par défaut très différent, la manière dont les parameters facultatifs fonctionnent a été dans .NET depuis le début – et cela implique toujours d’incorporer une constante dans les métadonnées, de sorte que le code appelant puisse copier cette constante dans l’appel. site si aucun argument correspondant n’est fourni.

Avec ssortingng.Empty c’est vraiment inutile – utiliser "" fera ce que vous voulez; est-ce si pénible d’utiliser le littéral de chaîne? (J’utilise le littéral partout – je n’utilise jamais ssortingng.Empty – mais c’est un argument différent.)

C’est ce qui me surprend à propos de 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 voulez 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 paramètre DateTime et la DateTime par défaut sur “l’heure actuelle”. Pour le moment, la seule solution vaguement élégante que je connaisse est la suivante:

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

… mais ce n’est pas toujours approprié.

En conclusion:

  • Je doute fort que cela fasse jamais partie de C #
  • Pour ssortingng.Empty c’est inutile de toute façon
  • Pour d’autres valeurs qui n’ont pas toujours la même valeur, cela peut vraiment être pénible