En C #, disons que vous souhaitez extraire une valeur de PropertyC dans cet exemple et ObjectA, PropertyA et PropertyB peuvent tous être null.
ObjectA.PropertyA.PropertyB.PropertyC
Comment puis-je obtenir PropertyC en toute sécurité avec le moins de code possible?
En ce moment, je vérifierais:
if(ObjectA != null && ObjectA.PropertyA !=null && ObjectA.PropertyA.PropertyB != null)
{
// safely pull off the value
int value = objectA.PropertyA.PropertyB.PropertyC;
}
Ce serait bien de faire quelque chose de plus comme ça (pseudo-code).
int value = ObjectA.PropertyA.PropertyB ? ObjectA.PropertyA.PropertyB : defaultVal;
Peut-être encore plus réduit avec un opérateur de fusion nul.
EDIT À l'origine, j'ai dit que mon deuxième exemple était comme js, mais je l'ai changé en psuedo-code car il a été correctement indiqué que cela ne fonctionnerait pas dans js.
ObjectA
ouPropertyA
sont nuls.Réponses:
En C # 6, vous pouvez utiliser l' opérateur conditionnel Null . Le test original sera donc:
la source
value
égal à siPropertyC
est nul? ou siPropertyB
est nul? et siObject A
est nul?null
. Cela commence de gauche à droite. Sans le sucre syntaxique, cela équivaut à une série d'instructions if oùif(propertyX == null) {value = null} else if (propertyY == null){ value = null} else if......
la dernière expression éventuelle étantif(propertyZ != null) { value = propertyZ }
Méthode d'extension courte:
En utilisant
Cette méthode d'extension simple et bien plus encore, vous pouvez trouver sur http://devtalk.net/csharp/chained-null-checks-and-the-maybe-monad/
ÉDITER:
Après l'avoir utilisé pendant un moment, je pense que le nom correct de cette méthode devrait être IfNotNull () au lieu de l'original With ().
la source
Pouvez-vous ajouter une méthode à votre classe? Sinon, avez-vous pensé à utiliser des méthodes d'extension? Vous pouvez créer une méthode d'extension pour votre type d'objet appelé
GetPropC()
.Exemple:
Usage:
En passant, cela suppose que vous utilisez .NET 3 ou supérieur.
la source
La façon dont vous le faites est correcte.
Vous pouvez utiliser une astuce comme celle décrite ici , en utilisant des expressions Linq:
Mais c'est beaucoup plus lent que de vérifier manuellement chaque propriété ...
la source
Refactor pour observer la loi de Déméter
la source
Mise à jour 2014: C # 6 a un nouvel opérateur
?.
appelé `` navigation sûre '' ou `` propagation nulle ''Lisez http://blogs.msdn.com/b/jerrynixon/archive/2014/02/26/at-last-c-is-getting-sometimes-called-the-safe-navigation-operator.aspx pour plus de détails
Cela a longtemps été une demande extrêmement populaire https://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/3990187-add-operator-to-c-?tracking_code=594c10a522f8e9bc987ee4a5e2c0b38d
la source
Vous recherchez évidemment la Monade Nullable :
devient
Cela renvoie
null
, si l'une des propriétés Nullable est NULL; sinon, la valeur deValue
.Méthodes d'extension LINQ:
la source
SelectMany
méthode d'extension est utilisée par lafrom ... in ... from ... in ...
syntaxe.En supposant que vous ayez des valeurs vides de types, une approche serait la suivante:
Je suis un grand fan de C # mais une très bonne chose dans le nouveau Java (1.7?) Est le.? opérateur:
la source
Ce code est "la moindre quantité de code", mais pas la meilleure pratique:
la source
Quand j'ai besoin d'enchaîner des appels comme ça, je me fie à une méthode d'aide que j'ai créée, TryGet ():
Dans votre cas, vous l'utiliseriez comme ceci:
la source
J'ai vu quelque chose dans le nouveau C # 6.0, c'est en utilisant '?' au lieu de vérifier
par exemple au lieu d'utiliser
vous utilisez simplement
J'espère que cela a aidé quelqu'un.
METTRE À JOUR:
Tu pourrais faire comme ça maintenant
la source
Vous pouvez faire ceci:
Ou encore mieux pourrait être ceci:
la source
vous pouvez utiliser l'extension suivante et je pense que c'est vraiment bien:
Et il est utilisé comme ceci:
la source
J'écrirais votre propre méthode dans le type de PropertyA (ou une méthode d'extension si ce n'est pas votre type) en utilisant le modèle similaire au type Nullable.
la source
Je viens de trébucher sur ce post.
Il y a quelque temps, j'ai fait une suggestion sur Visual Studio Connect concernant l'ajout d'un nouvel
???
opérateur.http://visualstudio.uservoice.com/forums/121579-visual-studio/suggestions/4104392-add-as-an-recursive-null-reference-check-opera
Cela nécessiterait un peu de travail de la part de l'équipe du framework mais pas besoin de modifier le langage, mais juste de faire de la magie du compilateur. L'idée était que le compilateur devrait changer ce code (syntaxe non autorisée atm)
dans ce code
Pour une vérification nulle, cela pourrait ressembler à
la source
J'ai écrit une méthode qui accepte une valeur par défaut, voici comment l'utiliser:
Voici le code:
la source
Ce n'est pas possible.
ObjectA.PropertyA.PropertyB
échouera siObjectA
est nul en raison d'un déréférencement nul, ce qui est une erreur.if(ObjectA != null && ObjectA.PropertyA
... fonctionne en raison d'un court-circuit, c'est-à-direObjectA.PropertyA
ne sera jamais vérifié siObjectA
c'est le casnull
.La première façon que vous proposez est la meilleure et la plus claire avec l'intention. Si quoi que ce soit, vous pourriez essayer de repenser sans avoir à vous fier à autant de valeurs nulles.
la source
Cette approche est assez simple une fois que vous avez surmonté le lambda gobbly-gook:
Avec une utilisation qui pourrait ressembler à:
la source
L'
??
opérateur (null-coalescing) signifie que si le premier argument estnull
, renvoie le second à la place.la source