Pourquoi la directive «using» et l'instruction «using» utilisent-elles le même mot-clé en C #?


10

La usingdirective nous donne accès aux types sans utiliser leurs noms complets:

using MyNamespace.Foo.Bar;

L' usinginstruction agit comme un sucre syntaxique pour les try/ finallyblocs qui garantissent que les objets sont éliminés correctement:

using(var x = new MyDisposableClass()) { ... }

Ces deux situations semblent n'avoir rien à voir l'une avec l'autre. Pourquoi utilisent-ils le même mot-clé?

Je doute que quelqu'un puisse jamais confondre les deux cas, mais il semble étrange de ne pas créer un nouveau mot pour une nouvelle fonctionnalité.


En passant, j'ai également lu sur la double utilisation de classC ++ (une pour déclarer les classes, une pour définir les paramètres du modèle), mais le deuxième cas a finalement obtenu son propre mot-clé typename, ce qui est plus logique pour moi.

Réponses:


7

Vous avez raison, car les deux utilisations de ne usingsont pas liées.

Cependant, il existe plusieurs bonnes raisons d'utiliser usingdans les deux cas.

  • L' usinginstruction a été créée pour .NET 1.0 et a un sens sémantique ("J'utilise cet espace de noms dans le code suivant")
  • Dans les deux cas, usingcela a un sens sémantique. En clair, vous êtes usingun espace de noms ou vous êtes usingl'objet jetable déclaré.
  • En surchargeant le usingmot - clé, les concepteurs de langage n'ont pas eu à créer un autre mot réservé dans la langue. Cela permet de garder la langue plus propre.

Il est possible que, compte tenu de leur temps, les concepteurs de langage aient choisi d'utiliser importdes déclarations d'espace de noms pour lever l'ambiguïté des deux choix ( usingun objet jetable est venu dans une version ultérieure de .NET). Nous ne le saurons jamais et ce n'est vraiment pas important car il est extrêmement clair laquelle des deux significations vous utilisez en raison du contexte.

Cela dit, n'allez pas using MyNamespace.DisposableObject = DisposableObject;partout dans votre code avec des alias d'espace de noms.


Merci. Pouvez-vous développer ce que vous entendez par «aide à garder la langue plus propre»? Dans mon esprit, la surcharge du mot-clé rend la langue moins propre. Je pense qu'il serait plus propre de créer un nouveau mot clé et d'utiliser des mots clés distincts pour des fonctionnalités distinctes.
eigenchris

5
Les mots clés ne peuvent pas être utilisés comme identifiants. L'introduction d'un nouveau mot-clé casse chaque programme qui utilise ce mot-clé comme identifiant. Vous ne pouvez introduire un mot clé d'une manière rétrocompatible que si vous avez accès à toutes les lignes de code source jamais écrites dans toute l'histoire de C♯, y compris le code source propriétaire, le code source secret, le code source militaire, etc.
Jörg W Mittag

@ JörgWMittag, Pas complètement vrai. C # a tout un tas de mots-clés contextuels qui ont été ajoutés de manière à ce que les identifiants existants portant ce nom n'entrent pas en conflit avec le code. varétant l'exemple classique où un type dans la portée nommé vara priorité sur le mot-clé.
David Arno

@ JörgWMittag Ou l'alternative est de rendre la version linguistique du compilateur sélectionnable (comme g++ --std=c++11, ou de permettre aux fichiers source de spécifier un dialecte (comme dans Haskell (?), Racket, Perl, même Python). Une langue peut également être conçue dans de façon à ce que les mots-clés ne se heurtent jamais syntaxiquement avec les identifiants possibles, sans réserver certains identifiants (bien que cela puisse être difficile pour votre implémentation de langage run-off-the-mill en utilisant un analyseur LALR avec un lexer à l'avant)
amon

1
@eigenchris vous pouvez toujours précéder keword d'un @ pour l'utiliser comme identifiant comme@using
Bill Tür

4

Les concepteurs de langage essaient généralement de limiter le nombre de mots clés. Lorsqu'un mot clé est réservé, il ne peut pas être utilisé comme identifiant dans le code utilisateur, ce qui est gênant s'il ne s'agit que du mot dont vous avez besoin. C'est également un obstacle lors du portage de code à partir d'autres langages - et Microsoft voulait que les gens portent le code de Java vers C #. C # a plus de mots clés que Java, mais chaque nouveau mot clé le rendrait plus difficile. De plus, les langages .net sont conçus pour interagir avec des API écrites dans différentes langues qui peuvent ne pas avoir les mêmes mots-clés, ce qui entraîne des désagréments si un membre public est également un mot-clé.

Les deux utilisations de usingsont sans ambiguïté, puisqu'elles apparaissent dans des positions dans la syntaxe, un «utilisation» est un terme approprié dans les deux cas. Il est donc logique de réutiliser le même mot clé. Vous noterez d'autres exemples de réutilisation de mots clés, par exemple:

  • new dans les contraintes génériques
  • indans foreachet dans les paramètres de type variant
  • defaultcomme clause dans switchet comme opérateur ( default(T)).
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.