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.