DUPLICATES possibles: strong>
Vérification de NULL profonde, y a-t-il une meilleure façon?
C # moyen élégant de vérifier si la propriété d'une propriété est null p>Je dois consulter un modèle d'objet profond comme celui-ci: p>
xxx pré> est là pour évaluer cela et renvoyer null si l'une de la chaîne est NULL (organisationnelle , parent, tête, etc.), sans avoir à faire un p>
xxx pré> blockquote>
5 Réponses :
Vous recherchez l'opérateur de déséroférence NULL-SAFE Espérons que cela sera mis en œuvre un jour ... P>
Voir aussi Cet article par Eric Lippert. La syntaxe qu'il propose qu'il y a ?. CODE> (également appelé navigation sûre) que certaines langues (par exemple, groovy) ont, mais malheureusement c # n'a pas cet opérateur. P >
.? Code>. P>
Il est plus fréquemment appelé Opérateur de propagation NULL B> ou NULL Opérateur conditionnel B>.
Il est maintenant disponible sur c # 6: MSDN.MicRosoft.com/en-us/ Bibliothèque / DN986595.ASPX
Avez-vous entendu parler du Loi de Demeter ? P>
Enchaîs à de telles séquences d'appels aussi longues n'est pas une bonne idée. Cela crée des dépendances affreuses entre les classes dont vous n'avez pas besoin. P>
Dans votre exemple, la classe contenant p code> devient dépendante de cinq em> d'autres classes. Je vous suggère de simplifier votre code et de faire une vérification de chaque classe pour NULLS à un seul niveau, dans leur propre contexte de connaissances. P>
D'accord mais pris sur une grande base de code, je ne peux pas le refaire tout dans une journée :)
@OOO: Je comprends. Dans ce cas, je pense que vous devez utiliser la chaîne laid de chèques nuls. J'essaierais d'encapsuler cela dans une méthode privée afin que les dépendances soient isolées et facilement reconnaissables.
Pour répondre à la question de votre titre, vous pouvez éviter d'appliquer la "loi de déméter" et en créant une méthode appelée getheadofparentorganizationalnit () p>
Je ne sais pas si la solution s'applique à votre cas spécifique, mais il vaut la peine de regarder si vous pouvez éliminer tous ces chèques nuls. P>
Voir aussi: Un lien a > p>
Mais alors la fonction getheadofparent. . aurait juste ce même chèque nulé imbriqué
@OOOO - Pas vraiment vous intervenez dans un niveau à la fois. Chaque classe ne parle que de son collaborateur immédiat, vous ne vous plaignez pas dans les internes du collaborateur pour déchirer de l'état imbriqué ... Lisez sur la loi de Demeter i>. De Wikipedia - un inconvénient de la loi de Demeter est qu'il faut parfois écrire un grand nombre de petites méthodes "wrapper" pour propager des appels de méthode vers les composants. En outre, l'interface d'une classe peut devenir volumineuse car elle héberge des méthodes de classes contenues, ce qui entraîne une classe sans interface cohérente. Mais cela pourrait aussi être un signe de mauvais design OO.
Consultez Cet article . Il présente une excellente solution qui vous permet d'écrire des choses comme ça:
Vous pouvez utiliser la manipulation d'exception de base aussi pour attraper cela. Je ne suis pas fou de cette solution, mais c'est une option. Si ces nuls imbriquées sont des opérations normales, des exceptions ne sont probablement pas la bonne réponse:
public class A { } public class B { public A a; } public class C { public B b; } class Program { static A GetA(C c) { A myA; try { myA = c.b.a; } catch { myA = null; } return myA; } static void Main(string[] args) { C theC = new C(); theC.b = new B(); theC.b.a = new A(); A goodA = GetA(theC); if (goodA != null) { Console.WriteLine("Expected nominal path."); } else { Console.WriteLine("Unexpected nominal path."); } theC.b.a = null; A badA = GetA(theC); if (badA == null) { Console.WriteLine("Expected off-nominal path."); } else { Console.WriteLine("Unexpected off-nominal path."); } } }
Invoquant le système de traitement des exceptions semble excessif pour des opérations normales; Cependant, comme vous l'avez dit, c'est une solution, pensant en dehors de la boîte.
@John K: Je suis d'accord - la seule façon dont j'avais jamais envisagé de considérer que ceci est si des NuLs imbriqués représentaient un état "cassé". De plus, il y a le problème de ne pas savoir quelle DÉRÉFERFEFECTURE a cassé le système et la performance frappée. Mais c'est un outil dans la boîte ...
Essayez d'éviter ce genre de recherche; S'il vous plaît voir ma réponse ci-dessous pour plus de détails.