Regola empirica: le variabili dovrebbero sempre essere - o il più vicino possibile a - l'ambito in cui sono necessarie. Un altro modo per esprimerlo è che le variabili dovrebbero essere racchiuse all'interno del contesto in cui hanno senso e sono effettivamente utili.
Molto spesso vorrete dichiarare la vostra variabile incrementale insieme all'istruzione for
. A volte lo dichiarerai un po 'più alto nella gerarchia perché hai bisogno di sapere quante occorrenze hai fatto in loop o a che punto il ciclo è stato interrotto.
In quasi tutti gli scenari, avendo una variabile di incremento del ciclo dichiarata come campo di una classe è una cattiva idea. Non ti darà alcun tipo di ulteriore "controllo"; semmai, inquinerà la tua classe e renderà più difficile capire dal punto di vista di un estraneo. Inoltre, se lo usi inavvertitamente in più di un ciclo, potrebbe addirittura violare il codice.
UPDATE:
Riguardo a quest'ultimo, poiché keshlam spiega molto bene nei commenti sottostanti, un ambito più piccolo ridurrà al minimo il rischio che la tua variabile venga modificata dove non ti aspetteresti. Inoltre, come spiega ulteriormente, le variabili possono liberare in modo sicuro la memoria utilizzata quando si esce dal campo di applicazione. La maggior parte delle lingue moderne lo farà automaticamente per te (il tuo chilometraggio può variare).
Inoltre, dal momento che hai chiesto a quale scopo potevano servire le variabili a livello di classe, ecco due esempi in c # :
Backend di proprietà
Questo è probabilmente il caso d'uso più popolare.
public class ConnectionHolder
{
// ...
IDbConnection _connection;
public IDbConnection Connection
{
get { return _connection; }
}
// ...
}
Titolare di informazioni sullo stato dell'istanza
Qui abbiamo la proprietà nell'esempio sopra che accede a una fabbrica che a sua volta produrrà un'istanza di IDbConnection
. La variabile _connectionAccessed
booleana funge da flag per indicare se è già stato effettuato un tentativo di ottenere una connessione di una connessione.
public class ConnectionHolder
{
// ...
bool _connectionAccessed = false;
IDbConnection _connection;
public IDbConnection Connection
{
get
{
if (!_connectionAccessed)
{
_connectionAccessed = true;
_connection = ConnectionFactory.Create();
}
return _connection;
}
}
// ...
}
Come puoi vedere nei due esempi sopra, è logico che le variabili vengano dichiarate nell'ambito di una classe completa.
Spero che queste informazioni siano utili.