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 plus courte) ou est-ce que je manque quelque chose?
Réponses:
Vous avez tout à fait raison. Toujours dans cette question , la première solution est suggérée alors que personne ne le remarque réellement
ToString()
donne déjà la bonne réponse.Peut-être que l'argument pour la solution la plus verbeuse est la lisibilité: lorsque vous appelez
ToString()
quelque chose qui est censé êtrenull
, vous vous attendez généralement à unNullReferenceException
, bien qu'ici il ne soit pas lancé.la source
ToString()
fonctionne sans que personne neNullReferenceException
soit jeté..HasValue
à toujours lever cette exception.myNullableDateTime.HasValue ? myNullableDateTime.Value.ToString("d") : null
où vous avez besoin de l'objet déballé pour accéder à laToString
méthode souhaitée . Bien sûr, il existe une solution plus concise pour cela aussi:$"{myNullableDateTime:d}"
Je pense que beaucoup de gens ont de tels contrôles car ce n'est pas un comportement naturel d'un objet qui peut avoir une valeur nulle.
la source
Non, vous avez raison, la version plus courte est la même que ce que d'autres personnes ont fait à cet égard. L'autre construction que j'ai tendance à utiliser beaucoup au lieu du ternaire avec nullables est l'opérateur de fusion nul ,. qui vous protège également des nulls. Pour ToString () ce n'est pas nécessaire (comme vous l'avez souligné) mais pour les valeurs int par défaut (par exemple) cela fonctionne bien, par exemple:
qui vous permet de faire toutes les opérations sur les entiers sur la page sans d'abord vérifier explicitement null et appeler la valeur dans currentPage (où currentPage est un int? peut-être passé comme paramètre)
la source
Je sais, longtemps après que c'était pertinent, mais ... je suppose que c'est parce que pour les types Nullable 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.
la source
peut-être est-ce 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:
la source
int?
est un sucre de syntaxe qui simplifie la déclaration d'une variable Nullable. C'est la même chose queNullable<int>
.Donc, si vous regardez l'implémentation de la
ToString()
méthode pourNullable<T>
(voir ci-dessous) , vous pouvez remarquer qu'elle renvoie une chaîne vide au cas où elle n'aurait pas de valeur.Ce que dit MSDN:
Ainsi, le code suivant affichera une chaîne vide sur la console au lieu de lever une
ArgumentNullException
exception.la source