¿Por qué la directiva "usar" y la instrucción "usar" usan la misma palabra clave en C #?


10

La usingdirectiva nos da acceso a los tipos sin usar sus nombres completos:

using MyNamespace.Foo.Bar;

La usingdeclaración actúa como azúcar sintáctica para try/ finallybloques que aseguran que los objetos se eliminen adecuadamente:

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

Estas dos situaciones parecen no tener nada que ver entre sí. ¿Por qué usan la misma palabra clave?

Dudo que alguien pueda confundir los dos casos, pero parece extraño no crear una nueva palabra para una nueva funcionalidad.


Como comentario aparte, también he leído sobre el doble uso de classen C ++ (uno para declarar clases, otro para definir parámetros de plantilla), pero el segundo caso finalmente obtuvo su propia palabra clave typename, lo que tiene más sentido para mí.

Respuestas:


7

Tienes razón en que ambos usos de usingno están relacionados.

Sin embargo, hay varias buenas razones para usar usingen ambos casos.

  • La usingdeclaración fue creada para .NET 1.0 y tiene sentido semántico ("Estoy usando este espacio de nombres en el siguiente código")
  • En ambos casos, usingtiene sentido semántico. En inglés simple, usted es usingun espacio de nombres o usingel objeto desechable declarado.
  • Al sobrecargar la usingpalabra clave, los diseñadores de idiomas no tuvieron que crear otra palabra reservada en el idioma. Esto ayuda a mantener el lenguaje más limpio.

Es posible que, dado su tiempo nuevamente, los diseñadores de lenguaje hayan elegido usar las importdeclaraciones de espacio de nombres para desambiguar las dos opciones ( usingun objeto desechable vino en una versión posterior de .NET). Nunca lo sabremos y realmente no es importante, ya que está extremadamente claro cuál de los dos significados que está utilizando debido al contexto.

Habiendo dicho todo eso, no vaya y ensucie su código con using MyNamespace.DisposableObject = DisposableObject;alias de espacio de nombres en todas partes.


Gracias. ¿Puedes ampliar lo que quieres decir con "ayuda a mantener el lenguaje más limpio"? En mi opinión, sobrecargar la palabra clave hace que el lenguaje sea menos limpio. Creo que sería más limpio crear una nueva palabra clave y usar palabras clave separadas para funcionalidades separadas.
eigenchris

55
Las palabras clave no pueden usarse como identificadores. La introducción de una nueva palabra clave rompe todos y cada uno de los programas que utilizan esa palabra clave como identificador. Solo puede introducir una palabra clave de manera compatible con versiones anteriores si tiene acceso a todas las líneas de código fuente que se hayan escrito en toda la historia de C♯, incluido el código fuente propietario, el código fuente secreto, el código fuente militar, etc.
Jörg W Mittag

@ JörgWMittag, no del todo cierto. C # tiene un montón de palabras clave contextuales que se agregaron de manera que los identificadores existentes con ese nombre no entren en conflicto con el código. varsiendo el ejemplo clásico donde un tipo dentro del alcance llamado vartiene prioridad sobre la palabra clave.
David Arno

@ JörgWMittag O la alternativa es hacer que la versión de idioma del compilador sea seleccionable (como g++ --std=c++11, o permitir que los archivos de origen especifiquen un dialecto (como en Haskell (?), Racket, Perl, incluso Python). También se puede diseñar un idioma en de manera que las palabras clave no chocan con sintácticamente posibles identificadores, sin reservar algunos identificadores (aunque eso podría ser difícil para su implementación en el lenguaje de escorrentía la fábrica usando un analizador LALR con un analizador léxico delante).
amon

1
@eigenchris siempre puedes preceder la palabra clave con una @ para usarla como un identificador como@using
Bill Tür

4

Los diseñadores de idiomas generalmente intentan limitar la cantidad de palabras clave. Cuando se reserva una palabra clave, no se puede usar como un identificador en el código de usuario, lo cual es molesto si es solo la palabra que necesita. También es un obstáculo al portar código de otros idiomas, y Microsoft quería que las personas transfirieran código de Java a C #. C # tiene más palabras clave que Java, pero cada nueva palabra clave lo haría más difícil. Además, los idiomas .net están diseñados para interactuar con las API escritas en diferentes idiomas que pueden no tener las mismas palabras clave, lo que genera molestias si un miembro público también es una palabra clave.

Los dos usos de usingson inequívocos, ya que aparecen en posiciones en la sintaxis, "usar" es un término apropiado en ambos casos. Por lo tanto, tiene sentido reutilizar la misma palabra clave. Observará otros ejemplos de reutilización de palabras clave, por ejemplo:

  • new en restricciones genéricas
  • inen foreachy en parámetros de tipo variante
  • defaultcomo cláusula en switchy como operador ( default(T)).
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.