Perché C # non consente scope-local usando direttiva?

3

Una cosa che non ottengo con la direttiva using di C # è il motivo per cui posso solo "usa" uno spazio dei nomi a livello di file e non all'interno di un ambito di blocco arbitrario.

( using namespace x; di C ++ consente questo e certamente i progettisti C # a conoscenza di questo.)

Se ho, ad esempio, una sola funzione nella mia classe che fa qualcosa con I / O di file, mi sembra che abbia senso scrivere solo:

void MunchFile(string name) {
  using System.IO; // not allowed
  ...
}

ma invece devo scrivere:

// somewhere at the top of the file:
using System.IO;
... 2 pages down ...
    void MunchFile(string name) {
      ...
    }

È un'irritazione ogni volta che lo incontro e continuo a grattarmi la testa perché questo non è stato permesso / implementato.

  • Ci sono delle affermazioni da parte dei designer C #. questo?
  • C'è qualche problema di progettazione del linguaggio concettuale. questo?
posta Martin Ba 07.04.2016 - 22:49
fonte

3 risposte

2

Sebbene non si riferisca specificamente alla direttiva using, l'articolo di Eric Gunnerson Meno 100 punti affronta la domanda generale di "perché C # non ha [caratteristica X] che ha C ++". La parte più rilevante è la seguente:

That wording implies that we started with an existing language (C++ and Java are the popular choices here), and then started removing features until we got to a point where we liked. And, though it may be hard for some to believe, that’s not how the language got designed.

One of the big reasons we didn’t do this is that it’s really hard to remove complexity when you take a subtractive approach, as removing a feature in one area may not allow you to revisit low-level design decisions, nor will it allow you to remove complexity elsewhere, in places where it support the now-removed feature.

So, we decided on the additive approach instead, and worked hard to keep the complexity down.

Continua descrivendo come l'importanza di una caratteristica possa essere soppesata rispetto alla complessità che introduce. Per farla breve, molte funzionalità che gli altri linguaggi non hanno apportato al taglio, perché i risultati che ottengono semplicemente non sono abbastanza convincenti per un linguaggio i cui progettisti miravano alla semplicità.

    
risposta data 07.04.2016 - 23:02
fonte
6

Perché la funzione proposta è un po 'sciocca.

Gli spazi dei nomi esistono appositamente per evitare conflitti di denominazione. Il using esiste per ASCIUGARE il tuo codice. Permette l'omissione dei prefissi dello spazio dei nomi per gli elementi in esso che non sono effettivamente in conflitto con qualcosa.

Detto questo, se c'è un conflitto di nome no al livello più alto, puoi mettere lo spazio dei nomi in alto. Non c'è alcun motivo non per metterlo semplicemente in cima! E poi l'intero file è un po 'DRY-er.

Nei casi normali, se c'è è un conflitto, l'aggiunta di uno spazio dei nomi a un ambito nidificato non elimina il conflitto.

using Collections.Or.Something;

public void UseAMagicalListForSomething()
{
    using My.Own.Magical.Collections;
    var myMagicalList = new List<OfWhatever>(); // STILL ambiguous.
}

Dovresti comunque utilizzare il nome classe completo:

using Collections.Or.Something;

public void UseAMagicalListForSomething()
{
    // lengthy, but unambiguous.
    var myMagicalList = My.Own.Magical.Collections.List<OfWhatever>();
}

O specifica un alias, che puoi facilmente fare in alto:

using Collections.Or.Something;
using magic = My.Own.Magical.Collections;

public void UseAMagicalListForSomething()
{
    var myMagicalList = magic.List<OfWhatever>(); // unambiguous.
}

Il singolo caso in cui la funzione proposta potrebbe risolvere un conflitto di denominazione e DRY con successo il tuo codice, sarebbe se ti capita di avere due blocchi di codice non sovrapposti nello stesso file.

Tuttavia, se quei blocchi di codice non sovrapposti utilizzano spazi di nomi completamente diversi, farei un passo indietro e mi chiedo se appartengano effettivamente allo stesso file. Se loro veramente fanno, direi che è meglio rendere chiara la relazione tra questi blocchi e l'ambito globale con gli alias dello spazio dei nomi.

    
risposta data 07.04.2016 - 23:27
fonte
-1

Ci sono alcuni motivi per cui potrebbe non essere stato permesso in C #.

  1. Rende più facile vedere quali spazi dei nomi vengono utilizzati se sono tutti in un'area centralizzata.

  2. È molto più semplice dichiarare l'utilizzo in un'unica posizione se si desidera utilizzarlo in più metodi.

  3. Praticamente tutti gli IDE con cui ho lavorato e VS in particolare ti diranno il nome completo di un tipo se passi il cursore su di esso. Pertanto, anche se si tratta di due pagine di codice giù dall'istruzione using, il nome è facile da scoprire rapidamente.

  4. L'istruzione using può già comparire nei metodi per aiutare l'eliminazione degli oggetti (ad esempio la chiusura dei flussi di file) in modo che il contesto sensibile a quel caso possa impedirgli di essere implementato ora.

risposta data 08.04.2016 - 16:22
fonte

Leggi altre domande sui tag