studio - ¿Por qué C#define dos usos diferentes para `usar`?
generar documentacion visual studio 2017 (3)
Le hice la misma pregunta a Eric Lippert en su blog hace unos años here (ver el primer comentario).
Su respuesta fue:
Este es un punto difícil del diseño del lenguaje; cuando una palabra clave se usa para representar dos conceptos completamente diferentes, puede ser confuso. Pero la introducción de una nueva palabra clave por concepto hace que el lenguaje se sienta un poco abultado. Personalmente, habría elegido "importaciones" o alguna sintaxis de este tipo para el formulario de la directiva para garantizar que no se confunda con el formulario de declaración, pero entiendo que es una decisión de juicio.
Estábamos diseñando una función para C # 4.0 que se cortó, que era otra forma de clase "parcial"; básicamente, una forma de compartir metadatos de atributo entre las mitades generadas por la máquina y generadas por el usuario de una clase parcial. Retrocedí usando la palabra clave "parcial" para la función porque entonces tendríamos TRES significados sutilmente diferentes para "parcial" en C #, lo cual sentí que era demasiado. (Estaba abogando por agregar otra palabra clave condicional "existente". Desafortunadamente, el punto terminó discutible ya que la función se cortó por falta de tiempo). - Eric
Para aquellos que no saben quién es Eric, él es un desarrollador del equipo del compilador de C #.
Más una pregunta por curiosidad que otra cosa, pero ¿por qué C # define dos "propósitos" diferentes para la palabra clave que using
? Por un lado, es una directiva ...
se utiliza para crear un alias para un espacio de nombres o para importar tipos definidos en otros espacios de nombres.
Por otro lado, es una afirmación que ...
define un alcance, fuera del cual se eliminará un objeto u objetos.
Para mí, parece que hay diferentes usos para la misma palabra clave, pero tal vez me esté perdiendo algo. ¿Hay alguna razón por la que esta palabra clave tiene dos propósitos diferentes? O, ¿son ambos de estos propósitos, en lo más profundo del compilador, realmente lo mismo?
Lo primero es que ambos encajan en la palabra, y como no pueden usarse en el mismo contexto, no pueden confundirse entre sí.
La razón, aparte de las preferencias de redacción, sería el número de palabras clave del idioma.
Las palabras clave están separadas de cualquier clase de biblioteca y tal. Puedo crear un método llamado DateTime sin romper o superponerlo con el tipo DateTime, ya que solo puedo usar espacios de nombres para especificar cuál quiero. Pero no puede * crear un método o variable llamada "público" porque es una palabra clave del idioma.
Debido a esto, la mayoría de los idiomas intentan mantener el número de palabras clave al mínimo (algunos incluso presumen el uso de pocas palabras clave). Cada palabra del idioma inglés que se usa como palabra clave deja de estar disponible para un programador para otros usos. Cuando sea posible, es mejor reutilizar las palabras clave existentes, en lugar de eliminar permanentemente otra página del diccionario de programadores (especialmente si el lenguaje ya está en uso, en cuyo caso una nueva palabra clave romperá cualquier código que lo use como identificador)
No puedo ver cómo estos dos usos podrían ser la misma cosa en el compilador.
Creo que la razón para el doble uso es simplemente el hecho de que la palabra clave se ajusta muy bien para ambos propósitos y no hay peligro de ambigüedad (una es directiva, la otra es una declaración, por lo que aparecen en un contexto completamente diferente). Creo que esto está perfectamente bien - un lenguaje debe tener un número reducido de palabras clave y sus usos deben ser fáciles de entender - ese es el caso de ambos usos de using
.
Como Linkgorn mencionó en un comentario, otro ejemplo de la misma situación es where
también existe en dos lugares (restricciones genéricas y sintaxis de consulta LINQ).