Il suffit de vérifier parfois de vérifier si un objet n'est pas un type de x, vous devez donc le faire à la place:
if(this is not X) { //Do my thing }
4 Réponses :
Qu'en est-il de l'opérateur logique Comme d'autres ont souligné, Tous deux CodeInchaos et StriPlingwarrior a des explications raisonnables pour pourquoi il n'y a pas de ! code>, convient à la description du mot "PRE>" PRE> XXX Pré>
est également utilisé pour vérifier si la classe d'objet hérite d'une certaine classe ou implémente une interface plutôt différente de
gettype () code>. p>
pas < / code> mot-clé en c #. p> p>
Nous n'avions pas besoin de faire pas code> un mot clé. Il serait probablement assez de fabrication
n'est pas code> un mot-clé similaire à
retour de rendement code>. Peut-être un peu déroutant car la plupart des programmeurs C # ne sont pas utilisés pour deux mots-clés de mots (ou devrais-je les appeler des clavasses?). Donc, il faudrait utiliser
ISnot code> que imo a l'air laid.
Je voudrais voir "!" autorisé dans quelques cas spéciaux en C où il aurait une signification claire, mais pas à présent être légal. Un cas serait en dehors des parenthèses pour un si, tandis que, etc. (dans de tels contextes, il doit inverser strictement la condition, quelles que soient les surcharges de l'opérateur). Un autre cas de ce type pourrait être bon ici: Autoriser "Ceci! Est x", afin d'éviter les parenthèses supplémentaires.
Utilisez le bon symbole OL 'BANG:
class Human: ICanSpeak, Mamal { ... } Human h; if (h is Human) { will be true } if (h is ICanSpeak) { will be true } if (h is Mamal) { will also be true }
Notez que et pourquoi il y aurait-il un mot-clé distinct lorsque vous pouvez simplement utiliser Vous pouvez mettre en œuvre une méthode d'extension, mais je pense que c'est stupide: p> this.getType () code>! =
typeof (x) code> renvoie false si cela est dérivé de (ou des outils dans le cas d'un type d'interface) mais pas identique to x, alors que
ceci est x code> renvoie true.
! (A est x) code>? C'est bloquant la langue avec peu de gain. Comme Eric Lippert aime souligner que chaque nouvelle fonctionnalité de langue doit offrir suffisamment d'avantages pour compenser le codage, la documentation, les tests et bien sûr la complexité accrue de la langue. Et un
pas est code> n'offre que suffisamment d'offrir suffisamment. P>
public static bool IsNot<T>(this object obj)
{
return !(obj is T);
}
Outre le fait que les méthodes d'extension sur l'objet sont une pratique de programmation discutable, ce n'est pas une mauvaise méthode de prolongation. Je ne dis pas que je l'utiliserais, mais je pense que c'est assez raisonnable.
@ Scientifique: j'ai vraiment souhaité que c # avait aussi un seul opérateur "pas" en plus de!. On pourrait dire que cela est inutile mais! est vraiment difficile à voir / repérer dans le code où "sinon (vecteur.isnormalisé)" est beaucoup plus facile d'analyser visuellement que "si! (vector.isnormalisé)", mais je suppose que c # a fait de cette façon de ne pas aliéner c ++ , droit?
@ERIC, puis-je demander pourquoi les méthodes d'extension d'objet sont considérées comme une mauvaise pratique?
@Joan: correct. Je conviens que l'utilisation de "!" signifie "non" est inutilement terrese; Fondamentalement, c'est un "code secret" que vous devez savoir pour comprendre la signification du texte. Mais comme vous le souhaitez, il s'agit d'idiomatique dans des langues comme des C. Dans VB, il y a un opérateur "Isnot", incidemment.
@Max: Parce qu'il est assez rare qu'il soit raisonnable d'avoir une méthode qui fonctionne sur des chaînes, des entiers, des tigres, des documents, des listes de bananes, des types ... Les chances sont bonnes que toute méthode d'extension sur "objet" est réellement raisonnable sur un petit sous-ensemble de tous les objets possibles. Ce n'est pas une règle dure et rapide, mais c'est un peu une odeur de code.
@ERIC: Merci Eric. Je n'ai jamais utilisé VB mais leur non-opérateur n'est pas vraiment bon. Je peux aussi imaginer c # personnes pensant "pas" est plus verbale si moins d'élite que d'avoir des opérateurs terrestres. J'ai en fait été dit cela. Personnellement, je n'aime pas les langues verbeuses mais pour certaines de ces choses comme "non" "et" "ou" Je pense qu'ils sont meilleurs que!, &&, ||. J'aime aussi quand ils sont tous des bouchons inférieurs comme les autres mots-clés C #. Mais un changement comme celui-ci ne serait certainement jamais considéré, non? En raison de toutes les complications qu'il pourrait introduire.
Je ne pense pas que ce soit stupide. Il y a beaucoup de fonctionnalités faites et d'être ajouté pour améliorer la lisibilité du code.
Ajout d'un mot-clé à une langue ajoute de la complexité. Ajout d'un mot-clé à une langue après que la spécification initiale puisse causer des modifications ruptières pour la mise à niveau des personnes. Les mots-clés sont donc généralement ajoutés s'il y a un cas très fort pour eux. Dans ce cas, comme les autres réponses soulignent, il est très facile d'utiliser l'opérateur de Bang: ... Développeur typique C # (/ C / C / C / C ++ / Java) lirait "Sinon (Pero est humain)". Donc, il n'y a pas beaucoup de justification pour un mot clé spécial. P> p>
Par exemple, nous n'avons aucun rendement code> mot-clé en C # parce que cela aurait été un changement de rupture.
retour de rendement x code> d'autre part était la syntaxe illégale avant et donc aucun changement de rupture.
@CODEINCHAOS: Oui, mais un n'est pas CODE> Mot-clé pourrait techniquement tomber dans la même catégorie que
retour de rendement code>. La différence est qu'il faut beaucoup de travail pour émuler
retour de rendement code>, alors que l'opérateur de bang et les parenthèses suffisent à émuler
n'est pas code>.
Je crois qu'un ISnot code> (aucun espaces) serait très facile et sûr de mettre en œuvre. Je voterais certainement pour cela pour faire partie de la syntaxe C #. Tant de fois tout en codant vite, je l'ai presque écrit. Cela vient très naturel. Cela aurait également l'intellientense et permettrait d'enregistrer tout le support et l'opérateur de négation en tapant. En bref, cela aurait été pratique.
Celles-ci ne seraient pas fonctionnellement équivalentes si
x code> était un sous-type de
ceci.getType () code>.