C'est une question stupide, mais vous pouvez utiliser ce code pour vérifier si quelque chose est d'un type particulier ...
if (child is IContainer) { //....
Existe-t-il un moyen plus élégant de vérifier l'instance "NOT"?
if (!(child is IContainer)) { //A little ugly... silly, yes I know...
//these don't work :)
if (child !is IContainer) {
if (child isnt IContainer) {
if (child aint IContainer) {
if (child isnotafreaking IContainer) {
Oui, oui ... question idiote ....
Parce qu'il y a une question sur l'apparence du code, c'est juste un simple retour au début d'une méthode.
public void Update(DocumentPart part) {
part.Update();
if (!(DocumentPart is IContainer)) { return; }
foreach(DocumentPart child in ((IContainer)part).Children) {
//...etc...
if (!(argument is MapsControlViewModel vm)) { return; }
- Je pourrais inverser le if et mettre le reste de la méthode dans les crochets if, mais j'obtiendrais alors le code de l'arbre de Noël, avec beaucoup de crochets de fermeture à la fin de la méthode. C'est beaucoup moins lisible.ifnot
déclarationsRéponses:
est le seul opérateur à aller (il n'y a pas d'
IsNot
opérateur).Vous pouvez créer une méthode d'extension qui le fait:
puis l'utiliser pour:
Et vous pouvez suivre votre thème:
Mise à jour (compte tenu de l'extrait de code de l'OP):
Puisque vous effectuez en fait un cast après la valeur, vous pouvez simplement utiliser à la
as
place:la source
IsNot
rien.Vous pouvez le faire de cette façon:
la source
is
a une priorité plus élevée par rapport à==
. La seule raison pour laquelle vous ne pouvez pas l'utiliser!x is f
est qu'elle a moins de priorité que!
.if (a is TextReader reader == false)
"devrait" fonctionner, mais il ne vous permettra pas d'utiliser la variable dans le vrai chemin en disant qu'elle n'a peut-être pas été initialisée.out
paramètres)if (a is TextReader reader == true)
qu'il pense que la variable n'est pas initialisée.Pourquoi ne pas simplement utiliser le reste?
Son propre familier et simple?
la source
La façon dont vous l'avez est très bien, mais vous pouvez créer un ensemble de méthodes d'extension pour créer "un moyen plus élégant de vérifier l'instance" NOT "".
Ensuite, vous pourriez écrire:
la source
Cela n'a pas encore été mentionné. Ça marche et je pense que ça a l'air mieux que d'utiliser
!(child is IContainer)
is
syntaxeexpr is constant
:, où expr est l'expression à évaluer et constante est la valeur à tester.la source
if (part as IContainer is null)
. Honnêtement, je ne sais pas ce qui est mieux.Laid? Je ne suis pas d'accord. La seule autre façon (je pense personnellement que c'est "plus laid"):
la source
as
clause.obj as int
est toujours une erreur de temps de compilation.is
forme.L'
is
opérateur évalue à un résultat booléen, vous pouvez donc faire tout ce que vous pourriez autrement faire sur un booléen. Pour le nier, utilisez l'!
opérateur. Pourquoi voudriez-vous avoir un opérateur différent juste pour cela?la source
La méthode d'extension
IsNot<T>
est un bon moyen d'étendre la syntaxe. Gardez à l'espritfonctionne mieux que de faire quelque chose comme
Dans votre cas, peu importe que vous reveniez de la méthode. En d'autres termes, veillez à ne pas effectuer à la fois la vérification de type et la conversion de type immédiatement après.
la source
Bien que cela n'évite pas le problème des parenthèses, pour le bien des gens qui arrivent ici via Google, il convient de mentionner qu'une syntaxe plus récente existe (à partir de C # 7) pour rendre le reste de votre code un peu plus propre:
Cela évite la double conversion, la vérification nulle et la disponibilité d'une variable dans les étendues où elle pourrait être nulle.
la source
Bien que l'opérateur IS soit normalement le meilleur moyen, il existe une alternative que vous pouvez utiliser dans certaines circonstances. Vous pouvez utiliser l'opérateur as et tester null.
la source
C # 9 (à paraître avec .NET 5) inclura les modèles logiques
and
,or
etnot
, ce qui nous permet d'écrire ceci plus élégamment:De même, ce modèle peut être utilisé pour vérifier la valeur null:
Vous pouvez trouver plus de détails sur le problème de Github qui suit ce changement.
la source
la source