web-dev-qa-db-fra.com

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, Reflector dit que: 

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

Alors, est-ce correct (la version la plus courte) ou est-ce que je manque quelque chose?

132
IamDeveloper

Vous avez tout à fait raison. Également dans cette question , la solution précédente est suggérée alors que personne ne remarque réellement que ToString() donne déjà la bonne réponse.

Peut-être que l'argument en faveur de la solution la plus commentée est la lisibilité: lorsque vous appelez ToString() sur quelque chose qui est supposé être null, vous généralement attendez une NullReferenceException, bien que ce ne soit pas jeté.

107
Tomas Vana

Je pense que beaucoup de gens ont de telles vérifications parce que ce n'est pas un comportement naturel d'un objet pouvant contenir une valeur nulle.

14
Andrew Bezzub

Non, vous avez raison, la version abrégée est identique à celle d'autres personnes à cet égard. L’autre construction que j’ai tendance à utiliser beaucoup au lieu de ternaire avec nullables est l’opérateur de coalescence nul. qui vous protège également des valeurs nulles. Pour ToString (), ce n'est pas nécessaire (comme vous l'avez indiqué), mais pour les valeurs int par défaut (par exemple), cela fonctionne bien, par exemple:

int page = currentPage ?? 1;

cela vous permet de faire toutes les opérations sur la page sans la première fois explicitement en vérifiant et en appelant la valeur dans currentPage (où currentPage est un entier? peut-être passé en tant que paramètre)

5
Paul

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

5
outis nihil

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

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

int? est un sucre de syntaxe qui simplifie la déclaration de variable nullable. C'est la même chose que Nullable<int>

Donc, si vous jetez un coup d'œil à l'implémentation de la méthode ToString() pour Nullable<T> (voir ci-dessous) , vous remarquerez qu'elle renvoie une chaîne vide au cas où elle n'aurait aucune valeur.

public struct Nullable<T> where T : struct
{
    public override string ToString()
    {
      if (!this.hasValue)
        return "";
      return this.value.ToString();
    }
}

Que dit MSDN:

Méthode Nullable.ToString

Renvoie la représentation textuelle de la valeur de l'objet Nullable actuel si la propriété HasValue est true ou une chaîne vide ("") si le La propriété HasValue est false.

Ainsi, le code suivant imprimera une chaîne vide sur la console au lieu de générer une exception ArgumentNullException.

static void Main(string[] args)
{
    int? a = null;
    Console.WriteLine(a.ToString()); // Prints empty string to console.
}
0
Aliaksei Maniuk