148 votes

Nullable ToString()

Je vois partout des constructions comme:

int? myVar = null;
string test = myVar.HasValue ? myVar.Value.ToString() : string.Empty;

Pourquoi ne pas utiliser simplement:

string test = myVar.ToString();

N'est-ce pas exactement la même chose ? Au moins un Réflecteur dit que:

public override string ToString()
{
  if (!this.HasValue)
  {
    return "";
  }
  return this.value.ToString();
}

Donc, est-ce correct (la version courte) ou ai-je raté quelque chose?

116voto

Tomas Vana Points 5686

Vous êtes tout à fait correct. Aussi, dans cette question, la première solution est suggéré alors que personne ne remarque effectivement ToString() donne déjà la réponse correcte.

Peut-être l'argument le plus détaillé de la solution est la lisibilité: Lorsque vous appelez ToString() sur quelque chose qui est censé être null, habituellement, vous pouvez s'attendre à un NullReferenceException, bien qu'ici, il n'est pas levée.

14voto

Andrew Bezzub Points 8794

Je pense que beaucoup de gens ont de telles vérifications, car il n'est pas un comportement naturel d'un objet qui peut contenir la valeur null.

5voto

Paul Points 8943

Non, vous avez raison, la version la plus courte est la même chose que ce que d'autres gens ont fait à cet égard. L'autre construction, j'ai tendance à utiliser beaucoup au lieu de le ternaire avec nullable est le nul de la coalescence opérateur. qui vous protège également contre les valeurs null. Pour ToString() il n'est pas nécessaire (comme vous l'avez souligné), mais par défaut les valeurs int (par exemple), il fonctionne très bien, par exemple:

int page = currentPage ?? 1;

qui vous permet de faire toutes les opérations sur entiers sur la page w/o explicitement pour la première fois la valeur null de la vérification et de l'appel de la valeur dans currentPage (où currentPage est un int? peut-être passé comme un param)

5voto

outis nihil Points 619

Je sais que, longtemps après qu'il était pertinent, mais ... je soupçonne que c'est parce que, pour les types nullables, comme int? l' .La méthode ToString() ne vous permettent pas d'utiliser les chaînes de format. Voir Comment formater un nullable DateTime avec ToString()? . Peut-être dans le code d'origine, il y avait une chaîne de format .ToString(), ou peut-être le codeur oublié que .ToString() sans la chaîne de format est toujours disponible sur les types nullables.

3voto

Andrey Points 36869

peut-être que c'est juste pour suivre modèle? ou ils ne savent pas le backend. vous avez raison, le code est exactement le même. vous pouvez même le faire:

int? i = null;
i.ToString(); //No NullReferenceException

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