Existe-t-il un moyen simple de faire ce qui suit:
String s = myObj == null ? "" : myObj.ToString();
Je sais que je peux faire ce qui suit, mais je le considère vraiment comme un hack:
String s = "" + myObj;
Ce serait formidable si Convert.ToString () avait une surcharge appropriée pour cela.
Convert.ToString()
fait exactement la première chose que vous avez écrite en dessous.Réponses:
Édition C # 6.0:
Avec C # 6.0, nous pouvons maintenant avoir une version succincte et sans cast de la méthode orignal:
Ou même en utilisant l'interpolation:
Réponse originale:
ou
pour être encore plus concis.
Malheureusement, comme cela a été souligné, vous aurez souvent besoin d'un cast de chaque côté pour que cela fonctionne avec des types non String ou Object:
Par conséquent, même s'il semble élégant, le casting est presque toujours nécessaire et n'est pas si succinct dans la pratique.
Comme suggéré ailleurs, je recommande peut-être d'utiliser une méthode d'extension pour rendre ce nettoyeur:
la source
string.Format formatera null comme une chaîne vide et appellera ToString () sur les objets non nuls. Si je comprends bien, c'est ce que vous recherchiez.
la source
"" + myObj
. Mais j'ai lu que cela crée des chaînes supplémentaires.str.Concat(myObj)
semble fonctionner très bien et est "encore plus rapide".Il y a eu
Convert.ToString(Object value)
depuis .Net 2.0 (environ 5 ans avant que cette question ne soit posée), qui semble faire exactement ce que vous voulez:http://msdn.microsoft.com/en-us/library/astxcyeh(v=vs.80).aspx
Est-ce que je manque / interprète mal quelque chose de vraiment évident ici?
la source
Avec une méthode d'extension, vous pouvez accomplir ceci:
Ce qui suit n'écrirait rien à l'écran et ne lèverait pas d'exception:
la source
string s = "" + myObj;
c'est piraté, l'appel d'une fonction sur un objet nul devrait tomber dans ce même bateau. Je voterais contre cela, mais cela résout le problème, je ne suis simplement pas d'accord avec l'utilisation. Les objets nuls devraient lancerNullReferenceException
, même dans les méthodes d'extension.ToStringOrEmptyWhenNull
.this
paramètre) car elles ne sont que du sucre syntaxique. C'estx.SomeExtensionMethod()
du sucre syntaxique pourSomeStaticClass.SomeExtensionMethod(x);
Ainsi, quandx
est-ce quenull
nous n'essayons pas d'invoquer une méthode sur unnull
objet mais plutôt de passer unnull
objet à une méthode statique. Si et seulement si cette méthode vérifie unnull
paramètre et lance lors de la rencontre, une méthode d'extension "invoquée" sur unnull
objet sera lancée.Je ne suis pas d'accord avec cela:
est un hack en aucune façon. Je pense que c'est un bon exemple de code clair. Il est absolument évident que vous voulez réaliser et que vous attendez null.
METTRE À JOUR:
Je vois maintenant que vous ne disiez pas que c'était un hack. Mais cela implique dans la question que vous pensez que cette voie n'est pas la voie à suivre. Dans mon esprit, c'est certainement la solution la plus claire.
la source
serait le moyen le plus court que je suppose et aurait également une surcharge de performance négligeable. Gardez à l'esprit qu'il ne serait pas tout à fait clair pour le lecteur du code quelle est l'intention.
la source
Concat
fait en fait une vérification nulle en dessous et retournestring.Empty
ouarg0.ToString()
, ce qui semble être légèrement plus performant (je veux dire, nous parlons de ms ici).en fait, je n'ai pas compris ce que vous voulez faire. Si je comprends bien, vous pouvez écrire ce code d'une autre manière comme celle-ci. Le demandez-vous ou non? Pouvez-vous expliquer plus?
la source
string s = string.IsNullOrEmpty(myObj) ? string.Empty : myObj.ToString();
Je pourrais être battu pour ma réponse, mais voici quand même:
J'écrirais simplement
string s = "" if (myObj! = null) {x = myObj.toString (); }
Y a-t-il un gain en termes de performances pour l'utilisation de l'opérateur ternaire? Je ne sais pas par-dessus ma tête.
Et clairement, comme quelqu'un l'a mentionné ci-dessus, vous pouvez mettre ce comportement dans une méthode telle que safeString (myObj) qui permet la réutilisation.
la source
J'ai eu le même problème et je l'ai résolu en jetant simplement l'objet en chaîne. Cela fonctionne également pour les objets nuls car les chaînes peuvent être nulles. À moins que vous ne souhaitiez absolument pas avoir de chaîne nulle, cela devrait fonctionner correctement:
la source
Quelques tests de performance (de vitesse) résumant les différentes options, pas que cela compte vraiment #microoptimization (en utilisant une extension linqpad )
Options
Il est probablement important de souligner qu'il
Convert.ToString(...)
conservera une chaîne nulle.Résultats
Objet
Chaîne
la source
Le commentaire de Holstebroe serait votre meilleure réponse:
Si
myObj
est null, Format y place une valeur de chaîne vide.Il répond également à votre exigence d'une ligne et est facile à lire.
la source
Même si c'est une vieille question et que l'OP a demandé C #, j'aimerais partager une solution VB.Net pour ceux qui travaillent avec VB.Net plutôt que C #:
Malheureusement, VB.Net n'autorise pas l'opérateur? Après une variable, donc myObj? .ToString n'est pas valide (du moins pas dans .Net 4.5, que j'ai utilisé pour tester la solution). Au lieu de cela, j'utilise If pour renvoyer une chaîne vide au cas où myObj ist Nothing. Ainsi, le premier Tostring-Call renvoie une chaîne vide, tandis que le second (où myObj n'est pas Nothing) renvoie "42".
la source