Il linguaggio C# richiede che tutte le variabili vengano assegnate definitivamente prima della lettura. Le variabili locali sono considerate inizialmente non assegnate, mentre i campi, gli elementi di matrice e così via sono considerati come inizialmente assegnati al loro valore predefinito. (Che, per un tipo di riferimento, è nullo.)
Non vi è alcun motivo tecnico per cui non è stato possibile trattare le variabili locali inizialmente assegnate ai valori predefiniti e eliminare tutti i controlli di assegnazione definiti. È lì perché usare un locale non assegnato come valore predefinito è (1) una cattiva pratica di codifica, e (2) una fonte altamente probabile di bug irritanti.Chiedendo all'utente di assegnare in modo esplicito variabili locali prima che vengano utilizzate, impediamo all'utente di utilizzare una cattiva pratica ed elimina un'intera classe di bug che non è quindi necessario eseguire il debug.
Inoltre, considerare quanto segue:
while(whatever)
{
int i;
print(i);
i = i + 1;
}
Ti aspetti che a tenere il suo valore attraverso esecuzioni del ciclo, o per essere inizializzato fresco a zero ogni volta? Costringendoti a inizializzarlo esplicitamente, la domanda diventa priva di significato e questa è una differenza che non fa differenza.
(Inoltre, nel caso sopra c'è un piccolo potenziale di ottimizzazione delle prestazioni, in quanto il compilatore può riutilizzare la variabile senza dover generare codice per cancellare il suo contenuto perché il compilatore sa che si si cancellerà il contenuto .)
Non so come rispondere alla seconda domanda perché non so cosa intendi per "lavoro". Puoi dirmi come assegnare "int x = 123;" lavori? Una volta che so cosa intendi per "funziona", allora posso descrivere come funziona l'assegnazione di un valore nullo a una variabile di tipo di riferimento.
fonte
2010-01-06 14:53:06
Stai parlando di campi che sono tipi di riferimento e ancora inizializzati come null? Allora perché una tale differenza? –
Differenza tra cosa? Essere locali o no? –
@Mehrdad: Penso che voglia sapere perché le variabili locali non sono automaticamente inizializzate al loro valore predefinito in contrapposizione ai campi. Il motivo è perché questo è già un'ottimizzazione. Il compilatore può tranquillamente dire se a una variabile locale è stato assegnato o meno un valore. Se non lo è, il compilatore genererà un errore in fase di compilazione. Questa ottimizzazione non sarebbe possibile per i campi. –