Por que a diretiva "using" e a instrução "using" usam a mesma palavra-chave em C #?

10

A usingdiretiva nos dá acesso a tipos sem usar seus nomes totalmente qualificados:

using MyNamespace.Foo.Bar;

A usingdeclaração atua como açúcar sintático para try/ finallyblocks, o que garante que os objetos sejam descartados adequadamente:

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

Essas duas situações parecem não ter nada a ver uma com a outra. Por que eles usam a mesma palavra-chave?

Duvido que alguém possa confundir os dois casos, mas parece estranho não criar uma nova palavra para uma nova peça de funcionalidade.


Como um aparte, eu também li sobre o uso duplo do classC ++ (um para declarar classes e outro para definir parâmetros de modelo), mas o segundo caso acabou por ter sua própria palavra-chave typename, o que faz mais sentido para mim.

eigenchris
fonte

Respostas:

7

Você está certo em que ambos os usos de usingnão são relacionados.

No entanto, existem várias boas razões para usar usingnos dois casos.

  • A usinginstrução foi criada para o .NET 1.0 e faz sentido semântico ("estou usando esse espaço para nome no código a seguir")
  • Nos dois casos, usingfaz sentido semântico. Em inglês simples, você é usingum espaço para nome ou usingo objeto descartável declarado.
  • Ao sobrecarregar a usingpalavra - chave, os designers de idiomas não precisaram criar outra palavra reservada no idioma. Isso ajuda a manter o idioma mais limpo.

É possível que, dado o tempo novamente, os designers de idiomas possam ter escolhido usar importdeclarações de namespace para desambiguar as duas opções ( usingum objeto descartável veio em uma versão posterior do .NET). Nós nunca saberemos e isso realmente não é importante, pois é extremamente claro qual dos dois significados você está usando devido ao contexto.

Dito tudo isso, não desarrume seu código com using MyNamespace.DisposableObject = DisposableObject;alias de namespace em todos os lugares.

Stephen
fonte
Obrigado. Você pode expandir o que quer dizer com "ajuda a manter o idioma mais limpo"? Na minha opinião, sobrecarregar a palavra-chave torna o idioma menos limpo. Eu acho que seria mais limpo criar uma nova palavra-chave e usar palavras-chave separadas para funcionalidades separadas.
eigenchris
5
Palavras-chave não podem ser usadas como identificadores. A introdução de uma nova palavra-chave interrompe todos os programas que usam essa palavra-chave como identificador. Você só pode introduzir uma palavra-chave de maneira compatível com versões anteriores se tiver acesso a todas as linhas de código-fonte já escritas em todo o histórico do C♯, incluindo código-fonte proprietário, código-fonte secreto, código-fonte militar e assim por diante.
Jörg W Mittag
@ JörgWMittag, Não é completamente verdade. O C # tem um monte de palavras-chave contextuais que foram adicionadas de maneira que os identificadores existentes com esse nome não entrem em conflito com o código. varsendo o exemplo clássico em que um tipo no escopo chamado vartem precedência sobre a palavra-chave.
David Arno
@ JörgWMittag Ou a alternativa é tornar a versão do idioma do compilador selecionável (como g++ --std=c++11, ou permitir que os arquivos de origem especifiquem um dialeto (como em Haskell (?), Racket, Perl e até Python) .Um idioma também pode ser projetado em de uma maneira que as palavras-chave nunca colidem sintaticamente com os possíveis identificadores, sem reservar alguns identificadores (embora isso possa ser difícil para a implementação da linguagem normal usando um analisador LALR com um lexer na frente).
amon
1
@eigenchris você sempre pode preceder a palavra-chave com um @ para usá-lo como um identificador como #@using
Bill Tür
4

Os designers de idiomas geralmente tentam limitar o número de palavras-chave. Quando uma palavra-chave é reservada, ela não pode ser usada como um identificador no código do usuário, o que é irritante se for apenas a palavra que você precisa. Também é um obstáculo ao transportar código de outros idiomas - e a Microsoft queria que as pessoas portassem código de Java para C #. O C # tem mais palavras-chave que Java, mas cada nova palavra-chave tornaria mais difícil. Além disso, as linguagens .net foram projetadas para interagir com as APIs escritas em diferentes linguagens que podem não ter as mesmas palavras-chave, o que leva a aborrecimentos se um membro público também for uma palavra-chave.

Os dois usos de usingsão inequívocos, uma vez que aparecem em posições na sintaxe, um "uso" é um termo apropriado nos dois casos. Portanto, faz sentido reutilizar a mesma palavra-chave. Você observará outros exemplos de reutilização de palavras-chave, por exemplo:

  • new em restrições genéricas
  • inforeachparâmetros de tipo dentro e em variante
  • defaultcomo uma cláusula switche como um operador ( default(T)).
JacquesB
fonte