J'adore l'opérateur null-coalescing car il facilite l'attribution d'une valeur par défaut pour les types Nullable.
int y = x ?? -1;
C'est génial, sauf si j'ai besoin de faire quelque chose de simple avec x
. Par exemple, si je veux vérifier Session
, je finis généralement par devoir écrire quelque chose de plus détaillé.
J'aimerais pouvoir faire ceci:
string y = Session["key"].ToString() ?? "none";
Mais vous ne pouvez pas car le .ToString()
est appelé avant la vérification de null, donc il échoue s'il Session["key"]
est nul. Je finis par faire ceci:
string y = Session["key"] == null ? "none" : Session["key"].ToString();
Cela fonctionne et c'est mieux, à mon avis, que l'alternative à trois lignes:
string y = "none";
if (Session["key"] != null)
y = Session["key"].ToString();
Même si cela fonctionne, je suis toujours curieux de savoir s'il existe un meilleur moyen. Il semble que peu importe ce que je dois toujours mentionner Session["key"]
deux fois; une fois pour le chèque, et encore une fois pour la mission. Des idées?
.?
) comme Groovy .Réponses:
Qu'en est-il de
la source
.ToStringOrDefault()
est ma façon préférée de le faire. Cependant, j'utilise cette réponse dans la méthode d'extension de Jon;)Si vous faites souvent cela spécifiquement avec,
ToString()
vous pouvez écrire une méthode d'extension:Ou une méthode prenant un défaut, bien sûr:
la source
.ToStringOrDefault()
est simple et élégant. Une belle solution.object
sont une malédiction et des ordures dans une base de code, et les méthodes d'extension qui fonctionnent sans erreur sur desthis
valeurs nulles sont du mal pur.Vous pouvez également utiliser
as
, qui donnenull
si la conversion échoue:Cela reviendrait
"none"
même si quelqu'un bourrait unint
dansSession["key"]
.la source
ToString()
en premier lieu.ToString()
pour convertir un objet contenant une chaîne en chaîne. Vous pouvez faire de même avecobj as string
ou(string)obj
. C'est une situation assez courante dans ASP.NET.ToString()
un objet (à savoir,Session["key"]
) dont il n'a pas mentionné le type. Cela peut être n'importe quel type d'objet, pas nécessairement une chaîne.Si ce sera toujours un
string
, vous pouvez lancer:Cela a l'avantage de se plaindre au lieu de cacher l'erreur si quelqu'un fourre un
int
ou quelque choseSession["key"]
. ;)la source
Toutes les solutions suggérées sont bonnes et répondent à la question; donc c'est juste pour étendre légèrement dessus. Actuellement, la majorité des réponses ne concernent que la validation nulle et les types de chaîne. Vous pouvez étendre l'
StateBag
objet pour inclure uneGetValueOrDefault
méthode générique , similaire à la réponse publiée par Jon Skeet.Une méthode d'extension générique simple qui accepte une chaîne comme clé, puis vérifie le type de l'objet de session. Si l'objet est nul ou n'est pas du même type, la valeur par défaut est renvoyée, sinon la valeur de session est renvoyée fortement typée.
Quelque chose comme ça
la source
HttpSessionState
.T value = source[key] as T; return value ?? defaultValue;
HttpSessionState
la session. :)Nous utilisons une méthode appelée
NullOr
.Usage
La source
la source
Dot
mais nous l'avons trouvé trop peu descriptif. Nous avons opté pourNullOr
un bon compromis entre l'auto-explication et la brièveté. Si vous ne vous souciez vraiment pas du nom du nom, vous pouvez toujours l'appeler_
. Si vous trouvez que les lambdas sont trop compliquées à écrire, vous pouvez utiliser un extrait de code pour cela, mais personnellement, je trouve cela assez facile. Quant à? :
, vous ne pouvez pas utiliser cela avec des expressions plus complexes, vous devez les déplacer vers un nouveau local;NullOr
vous permet d'éviter cela.Ma préférence, pour un one off, serait d'utiliser un cast sécurisé en chaîne au cas où l'objet stocké avec la clé n'en serait pas un. L'utilisation
ToString()
peut ne pas avoir les résultats souhaités.Comme le dit @Jon Skeet, si vous vous trouvez souvent en train de faire cela, une méthode d'extension ou, mieux, peut-être une méthode d'extension en conjonction avec une classe SessionWrapper fortement typée. Même sans la méthode d'extension, le wrapper fortement typé peut être une bonne idée.
Utilisé comme
la source
créer une fonction auxiliaire
la source
La réponse de Skeet est la meilleure - en particulier, je pense que la sienne
ToStringOrNull()
est assez élégante et répond le mieux à vos besoins. Je voulais ajouter une autre option à la liste des méthodes d'extension:Renvoie l'objet d'origine ou la valeur de chaîne par défaut pour null :
À utiliser
var
pour la valeur renvoyée car elle reviendra comme type d'entrée d'origine, uniquement comme chaîne par défaut lorsquenull
la source
null
defaultValue
si elle n'est pas nécessaire (c'est-à-direinput != null
)?input != null
eval renverra l'objet comme lui-même.input == null
renvoie la chaîne fournie en tant que paramètre. par conséquent, il est possible qu'une personne puisse appeler.OnNullAsString(null)
- mais le but (bien que rarement une méthode d'extension utile) était de s'assurer que vousinput!=null
scénario ne renverra l'entrée que s'ildefaultValue!=null
est également valide; sinon, il lancera un fichierArgumentNullException
.Ceci est mon petit "opérateur Elvis" de type sécurisé pour les versions de .NET qui ne prennent pas en charge?.
Le premier argument est l'objet testé. La deuxième est la fonction. Et le troisième est la valeur nulle. Donc pour votre cas:
Il est également très utile pour les types Nullable. Par exemple:
la source