2010-05-06 11 views
13

La palabra clave using tiene tres significados dispares:¿Por qué los diseñadores de C# asociaron tres significados diferentes a la palabra clave 'usar'?

  1. tipo/espacio de nombres de alias
  2. importación espacio de nombres
  3. azúcar sintáctica para asegurar Desechar se llama

La documentación llama las dos primeras definiciones directivas (que supongo que significa que están preprocesando en la naturaleza), mientras que la última es una declaración .

Independientemente de que se distingan por sus sintaxis, ¿por qué los desarrolladores del lenguaje complicarían la semántica de la palabra clave al asociarle tres significados diferentes? Por ejemplo, (descargo de responsabilidad: fuera de mi cabeza, sin duda puede haber mejores ejemplos) ¿por qué no agregar palabras clave como alias y import? ¿Razones técnicas, teóricas o históricas? Cuota de palabra clave? ;-)

muestra Contrived:

import System.Timers; 
alias LiteTimer=System.Threading.Timer; 
alias WinForms=System.Windows.Forms; 

public class Sample { 
    public void Action() { 
    var elapsed = false; 
    using(var t = new LiteTimer.Timer(_ => elapsed = true) { 
     while (!elapsed) CallSomeFinickyApi(); 
    } 
    } 
} 

"Uso" es una palabra tan vaga.

+1

estaría feliz de ser capaz de utilizar el 'Directiva using' dentro de una función, al igual que en C++. Supongo que esto no es posible exactamente debido a esa dualidad. – liori

+1

FYI, las dos primeras son directivas porque no generan ningún código; solo cambian la tabla de nombres. El último es una declaración porque hace que se genere código. – Gabe

+0

@Gabe Gracias por aclarar eso. –

Respuesta

13

Es una llamada de mala calidad. Personalmente, habría tomado la decisión que sugieres: utiliza algo como "alias" e "importación". Observo que "alias" es una palabra clave contextual de C# y se usa para declarar que un alias extern está en uso en un archivo en particular; parece más natural usar eso para declarar un alias de tipo en lugar de "usar".

La forma de declaración de "usar" en realidad se agregó bastante tarde en el juego; los diseñadores deseaban usar "usar" no solo porque ya es una palabra clave, sino también porque enfatiza que un recurso se está utilizando en una región particular de código y luego se va. El hecho de que "usar" ya tenía un significado en el sentido directivo fue un feliz accidente.

Si este tema le interesa, he escrito varios artículos sobre él. Aquí, por ejemplo, tengo artículos sobre cómo "fijo", "parcial" y "en" también tienen significados múltiples en C#:

http://blogs.msdn.com/ericlippert/archive/tags/What_2700_s+The+Difference_3F00_/default.aspx

Otra respuesta también se vincula a mi artículo sobre cómo nos aseguramos de que no demasiados palabras están reservadas para el uso de la lengua:

http://ericlippert.com/2009/05/11/reserved-and-contextual-keywords/

+0

Esta es la respuesta que estaba buscando. ¡Gracias!Estoy de acuerdo con que "usar" parece ser el más adecuado; de ahí que en mi ejemplo cambie el nombre de los otros usos. Gracias por los enlaces, ¡espero leerlos! –

18

Su pregunta asume que 3 significados contextuales para 1 palabra clave es más complejo que 3 palabras clave diferentes con diferentes significados. Algunos pueden disputar esto.

En mis años de codificación C#, no puedo decir que alguna vez me haya confundido el significado de 'usar'; siempre está claro desde el contexto.

+0

Aunque personalmente no he tenido un problema con 'usar' tener múltiples usos y significados, puedo ver cómo puede ser difícil para algunos. – JYelton

+1

Nunca me han confundido los múltiples significados, pero mis herramientas sí. Sería muy bueno si todas las herramientas de manejo de texto en mi sistema que he instalado a lo largo de las décadas pudieran actualizarse para comprender la sintaxis de todos los lenguajes que uso, pero eso no parece suceder. – Ken

+2

Aunque aprecio tu opinión, no estás respondiendo la pregunta. Mi pregunta no supone nada acerca de la complejidad o la confusión. (No creo que los significados sean confusos o difíciles de discernir). Considerando que empiezas un nuevo idioma con una pizarra en blanco (y mucha historia y teoría), mi pregunta es por qué decidieron consolidar tres características en una sola. ¿palabra clave? –

7

Creo que un diseñador de idiomas está obligado a utilizar el menor número posible de palabras clave para minimizar los conflictos de nombres con los identificadores. Si imagina a alguien portando código desde C++ o Java, menos palabras clave implican una menor probabilidad de enfrentamientos.

Esto no está realmente en el alcance de su pregunta, pero este problema es especialmente relevante cuando se crea una nueva versión de un idioma existente. C# 3 agregó palabras clave contextuales, es decir, identificadores que se convierten en palabras clave solo cuando se usan en una situación específica. Solo para evitar que el código existente se vuelva inválido.

Y estoy de acuerdo con @Judas que los 3 usos de 'usar' no son confusos (en mi humilde opinión). C# ya ha sido, erróneamente, creo, acusado de ser demasiado parecido a Java. Imagínese lo que algunas personas habrían dicho si tuviera una palabra clave de 'importación' ...

+1

Muy interesante respuesta. Gracias. (Y estoy de acuerdo en que no son confusos, esa no es la base de mi pregunta.) –

7

Eric Lippert (que tiene y creo que actualmente trabaja en el equipo C# de Microsoft) publicó un comentario en respuesta a una pregunta similar en su blog (first comment). Citando a él:

Este es un punto complicado del lenguaje diseño; cuando una palabra clave se usa para representan dos conceptos completamente diferentes, puede ser confuso. Pero introduciendo una nueva palabra clave por concepto hace que el idioma se sienta un poco hinchado. yo personalmente habría elegido "importaciones" o algo por el sintaxis de la forma directiva para asegurarse de que es no confundir con el formulario de declaración, pero entiendo que es un juicio llamada.

+0

¡Excelente meta-respuesta! ¡Gracias! –

+2

Sí, todavía estoy aquí. –

Cuestiones relacionadas