Cosa si intende per ambito di una variabile?

7

Penso all'ambito di una variabile come -

"L'ambito di una variabile particolare è l'intervallo all'interno del codice sorgente di un programma in cui tale variabile viene riconosciuta dal compilatore".

Tale affermazione è tratta da "Ambito e durata delle variabili in C ++" , che ho letto molti mesi fa.

Recentemente mi sono imbattuto in questo nei corsi LeMoyne-Owen College :

Qual è esattamente la differenza tra l'ambito delle variabili in C # e (C99, C ++, Java) quando

However a variable still must be declared before it can be used

    
posta jsp99 23.03.2012 - 08:17
fonte

3 risposte

12

What is meant by the "scope" of a variable? think of the scope of a variable as "The scope of a particular variable is the range within a program's source code in which that variable is recognized by the compiler".

Quella definizione corrisponde alla definizione di scope nella specifica C #; dice:

The scope of a name is the region of program text within which it is possible to refer to the entity declared by the name without qualification of the name

Si noti che la specifica C # indica che è il nome che ha un ambito. Alcune variabili non hanno nomi e quindi non hanno portata. E alcune cose hanno nomi ma non sono variabili; nomi di classi, nomi di spazi dei nomi, nomi di funzioni e così via, tutti hanno un ambito.

L'ambito di una variabile locale viene spesso confuso con la sua vita . La durata di una variabile locale è talvolta correlata al suo ambito; quando il controllo lascia l'ambito di un locale (attraverso mezzi normali o tramite un'eccezione), il locale può essere distrutto senza che nessuno se ne accorga. Tuttavia, il runtime è permesso per rendere la vita di una variabile locale più breve se può farlo senza che nessuno se ne accorga. Il runtime è anche permesso per far vivere una variabile locale più a lungo del suo ambito. E ci sono alcune situazioni in cui una variabile locale è richiesta per vivere oltre quando il controllo lascia il suo ambito. (Ad esempio, quando il locale è una variabile esterna chiusa di un lambda.)

Quindi non è saggio usare "scope" come sinonimo di "lifetime". Sono spesso correlati ma possono essere abbastanza diversi. Usa "scope" per indicare "la regione di testo in cui un nome è valido", non "il periodo di tempo in cui una variabile è viva". L'ambito è fondamentalmente un concetto in fase di compilazione .

What exactly is the difference between the scope of variables in C# and (C99, C++, Java)

Non ho familiarità con le esatte regole di scoping di C, C ++ o Java per dare una breve lista delle differenze . Posso tuttavia sottolineare alcune stranezze di C #.

Il primo è che in C #, una variabile locale è in ambito in tutto il suo blocco.

class C
{
    int x;
    void M()
    {
        int y = x;
        int x = y;
    }
}

In C ++, la prima "x" significa "this.x" perché la variabile locale x non è in ambito fino alla sua dichiarazione. In C #, la variabile locale x è nell'ambito del blocco. L'utilizzo di un locale che è in ambito prima della sua dichiarazione è un errore in C #.

Il secondo è che in C #, un nome semplice deve significare la stessa cosa in tutto lo scope in cui viene usato per la prima volta:

class C
{
    int x;
    void M()
    { // M starts
        int y = x;
        if (y > 100)
        {
            int x = y;
        }
    }
}

Questo è illegale perché all'interno del blocco etichettato "M inizia" il semplice nome "x" è usato per indicare due cose diverse. Ora la prima "x" significa "this.x" perché il locale non è nel campo di applicazione. Ma è illegale usare lo stesso nome per indicare due cose diverse, perché questa è una fonte di bug.

Se questo argomento ti interessa, ho scritto un numero di articoli su di esso. Vedere

link

link

AGGIORNAMENTO: La regola secondo cui un nome semplice deve avere un significato univoco in tutto il blocco che la racchiude è stata rilassata nel C # 6. Il team di progettazione linguistica ha deciso che il costo della confusione degli utenti era troppo alto per il beneficio nella cattura degli errori.

    
risposta data 28.03.2012 - 17:11
fonte
4

Il termine "ambito", qui, si riferisce al tempo in cui una variabile esiste nella vita. Inizia quando viene chiamato il costruttore e termina quando viene chiamato il distruttore.

In C ++ e Java la variabile inizia ad esistere quando viene rilevata la sua definizione e termina all'esistenza quando viene raggiunta la fine del blocco che contiene tale definizione (tramite il flusso sequenziale o un'istruzione "jump-ahead" come interruzione , goto, return, throw)

In C # tutte le variabili dichiarate in un blocco vengono create all'ingresso del blocco, ma inizializzate di conseguenza alla loro definizione (quindi non possono essere usate prima, sebbene già "esistano" in termini di spazio allocato, e quindi possono essere referenziate, poiché il loro indirizzo è già noto)

All'interno di un blocco locale questo è molto più un sofisma, che non fa alcuna differenza reale per il programmatore, ma - per ambiti più ampi - consente al compilatore di generare il codice anche in presenza di "dipendenze circolari", che in C ++ devono essere evitate con altri trucchi come protezioni di intestazione o costruzione a due fasi ecc.

    
risposta data 23.03.2012 - 08:33
fonte
0

In C ++ e Java il seguente codice è legale, ma in C # causerebbe questo conflitto: "la variabile locale 'logging' non può essere dichiarata in questo ambito perché darebbe un significato diverso a 'logging', che è già usato in un ambito figlio ".

// Statically check script.
{
    Boolean logging = false;
    MyClass.check(script, logging);
}

// Translate code.
Boolean logging = true;
MyClass.translate(script, logging);
    
risposta data 03.08.2014 - 09:33
fonte

Leggi altre domande sui tag