9
votes

Pourquoi n'y a-t-il pas "n'est pas" mot-clé en C #?

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
 }


1 commentaires

Celles-ci ne seraient pas fonctionnellement équivalentes si x était un sous-type de ceci.getType () .


4 Réponses :


21
votes

Qu'en est-il de l'opérateur logique ! , convient à la description du mot "PRE>" PRE> XXX

Comme d'autres ont souligné, 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 () .

Tous deux CodeInchaos et StriPlingwarrior a des explications raisonnables pour pourquoi il n'y a pas de pas < / code> mot-clé en c #.


2 commentaires

Nous n'avions pas besoin de faire pas un mot clé. Il serait probablement assez de fabrication n'est pas un mot-clé similaire à retour de rendement . 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 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.



4
votes

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  }


0 commentaires

4
votes

Notez que 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.

et pourquoi il y aurait-il un mot-clé distinct lorsque vous pouvez simplement utiliser ! (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>

Vous pouvez mettre en œuvre une méthode d'extension, mais je pense que c'est stupide: p>

public static bool IsNot<T>(this object obj)
{
  return !(obj is T);
}


7 commentaires

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.



10
votes

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: xxx

... 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.


3 commentaires

Par exemple, nous n'avons aucun rendement mot-clé en C # parce que cela aurait été un changement de rupture. retour de rendement x d'autre part était la syntaxe illégale avant et donc aucun changement de rupture.


@CODEINCHAOS: Oui, mais un n'est pas Mot-clé pourrait techniquement tomber dans la même catégorie que retour de rendement . La différence est qu'il faut beaucoup de travail pour émuler retour de rendement , alors que l'opérateur de bang et les parenthèses suffisent à émuler n'est pas .


Je crois qu'un ISnot (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.