Perché la direttiva "using" e l'istruzione "using" usano la stessa parola chiave in C #?


10

La usingdirettiva ci dà accesso ai tipi senza usare i loro nomi completi:

using MyNamespace.Foo.Bar;

L' usingistruzione funge da zucchero sintattico per try/ finallyblocchi che assicurano che gli oggetti vengano smaltiti correttamente:

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

Queste due situazioni sembrano non avere nulla a che fare l'una con l'altra. Perché usano la stessa parola chiave?

Dubito che qualcuno confonderebbe mai i due casi, ma sembra strano non creare una nuova parola per una nuova funzionalità.


A parte questo, ho letto anche del doppio uso di classin C ++ (uno per dichiarare le classi, uno per definire i parametri del modello), ma il secondo caso alla fine ha ottenuto la sua parola chiave typename, il che ha più senso per me.

Risposte:


7

Hai ragione nel dire che entrambi gli usi di usingnon sono correlati.

Tuttavia, ci sono diversi buoni motivi per usare usingin entrambi i casi.

  • L' usingistruzione è stata creata per .NET 1.0 e ha senso semantico ("Sto usando questo spazio dei nomi nel seguente codice")
  • In entrambi i casi, usingha senso semantico. In parole povere, sei usinguno spazio dei nomi o sei usingl'oggetto usa e getta dichiarato.
  • Sovraccaricando la usingparola chiave, i progettisti del linguaggio non hanno dovuto creare un'altra parola riservata nella lingua. Questo aiuta a mantenere il linguaggio più pulito.

È possibile che, visto il loro tempo, i progettisti del linguaggio potrebbero aver scelto di utilizzare le importdichiarazioni dello spazio dei nomi per chiarire le due scelte ( usingun oggetto usa e getta è arrivato in una versione successiva di .NET). Non lo sapremo mai e non è davvero importante poiché è estremamente chiaro quale dei due significati stai usando a causa del contesto.

Detto questo, non andare e sporcare il tuo codice con using MyNamespace.DisposableObject = DisposableObject;alias dello spazio dei nomi ovunque.


Grazie. Puoi approfondire ciò che intendi con "aiuta a mantenere il linguaggio più pulito"? Nella mia mente, sovraccaricare la parola chiave rende la lingua meno pulita. Penso che sarebbe più pulito creare una nuova parola chiave e utilizzare parole chiave separate per funzionalità separate.
Eigenchris,

5
Le parole chiave non possono essere utilizzate come identificatori. L'introduzione di una nuova parola chiave interrompe ogni programma che utilizza tale parola chiave come identificatore. Puoi introdurre una parola chiave in modo compatibile con le versioni precedenti se hai accesso a tutte le righe di codice sorgente mai scritte nell'intera cronologia di C♯, inclusi codice sorgente proprietario, codice sorgente segreto, codice sorgente militare e così via.
Jörg W Mittag,

@ JörgWMittag, non del tutto vero. C # ha un sacco di parole chiave contestuali che sono state aggiunte in modi che significano che gli identificatori esistenti con quel nome non sono in conflitto con il codice. varessendo il classico esempio in cui un tipo di ambito denominato varha la precedenza sulla parola chiave.
David Arno,

@ JörgWMittag Oppure l'alternativa è rendere selezionabile la versione in lingua del compilatore (come g++ --std=c++11, o consentire ai file sorgente di specificare un dialetto (come in Haskell (?), Racket, Perl, persino Python). Una lingua può anche essere progettata in un modo in cui le parole chiave non si scontrano mai sintatticamente con possibili identificatori, senza riservare alcuni identificatori (anche se ciò potrebbe essere difficile per l'implementazione del linguaggio run-off-the-mill usando un parser LALR con un lexer in primo piano).
amon

1
@eigenchris puoi sempre precedere la parola chiave con una @ per usarla come identificatore come@using
Bill Tür

4

I progettisti di lingue generalmente cercano di limitare il numero di parole chiave. Quando una parola chiave è riservata, non può essere utilizzata come identificatore nel codice utente, il che è fastidioso se è solo la parola che ti serve. È anche un ostacolo quando si esegue il porting di codice da altre lingue - e Microsoft voleva che le persone portassero il codice da Java a C #. C # ha più parole chiave di Java, ma ogni nuova parola chiave renderebbe più difficile. Inoltre, le lingue .net sono progettate per interagire con le API scritte in lingue diverse che potrebbero non avere le stesse parole chiave, il che provoca fastidi se un membro pubblico è anche una parola chiave.

I due usi di usingnon sono ambigui, poiché appaiono in posizioni nella sintassi, un "uso" è un termine appropriato in entrambi i casi. Quindi ha senso riutilizzare la stessa parola chiave. Noterai altri esempi di riutilizzo delle parole chiave, ad esempio:

  • new in vincoli generici
  • inin foreache in parametri di tipo variante
  • defaultcome clausola in switche come operatore ( default(T)).
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.