Il me semble qu'il n'y a vraiment aucune garantie qu'une variable non nullable n'aura jamais null. Imaginez que j'ai une classe qui a une propriété qui n'est pas nullable:
public class Foo
{
public Foo(string test)
{
Test = test;
}
public string Test {get;set;}
}
Maintenant, cela pourrait sembler être désormais nul. Mais si nous référençons cette classe avec une autre bibliothèque qui n'utilise pas de contexte nullable, rien ne l'empêche d'envoyer null dedans.
Est-ce correct ou il y a peut-être des vérifications d'exécution qui assurent cela?
c#
c#-8.0
nullable-reference-types
Ilya Chernomordik
la source
la source
public void Foo(string test){...}
oupublic Foo(string test){...}
?Réponses:
Voici ce que MS en dit ( https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/upgrade-to-nullable-references#interfaces-with-external-code ):
la source
quelqu'un peut toujours faire
Peut-être que vous pouvez utiliser la conception pilotée par domaine
la source
Vous avez raison, un autre code qui n'utilise pas la nouvelle fonctionnalité pourrait affecter null à cette propriété, il n'y a pas de vérification au moment de l'exécution, il s'agit simplement d'indicateurs de conformité.
Vous pouvez toujours le faire vous-même si vous souhaitez une vérification de l'exécution:
Notez que vous pouvez garantir que la plupart de votre code n'est pas nul , il vous suffit d'ajouter des gardes à votre API publique de niveau supérieur et de vous assurer que les classes sont correctement scellées, etc.
Bien sûr, les gens peuvent toujours utiliser la réflexion pour f *** votre code, mais alors c'est sur eux
la source
Of course people can still use reflection to f*** your code up
, vrai, vrai en effet. Vous pouvez certainement utiliser la réflexion pour ce faire, est-ce recommandé , non , les gens le font-ils toujours, oui.Même dans votre propre code, si vous choisissez de le faire, vous pouvez passer
null
, en utilisant l'opérateur pardonnant les valeurs nulles.null!
est considéré comme non nul en ce qui concerne l'analyse de nullité du compilateur.la source
Pour gérer les vérifications nulles et rendre votre code lisible, je suggère le modèle Null Object Design.
Plus de lecture ici:
https://www.c-sharpcorner.com/article/null-object-design-pattern/
Fondamentalement, cela implique de créer un nouvel objet qui est dérivé de la même interface et a une instance nulle.
Exemple:
Les valeurs nulles ne peuvent pas être évitées, mais elles peuvent être vérifiées proprement.
la source