Domanda

Funziona:

class MyClass
{
    int a;

    public MyClass()
    {
        int b = a;
    }
}

Ma questo dà un errore del compilatore (" Uso della variabile locale non assegnata 'a' "):

class MyClass
{
    public MyClass()
    {
        int a;
        int b = a;
    }
}

Per quanto ne so, ciò accade perché nel primo esempio, tecnicamente, il compilatore non sa che "a" non è assegnato. Nell'ultimo esempio, "a" è definito localmente ed è quindi facile da rintracciare.

Ma perché il secondo esempio non funziona?

I numeri interi non sono impostati su 0? È questo qualcosa che il compilatore applica per "le migliori pratiche"? O c'è un altro motivo?

È stato utile?

Soluzione

Nel primo esempio è un campo . I campi vengono automaticamente impostati su 0 / false / null. Nel secondo esempio è una variabile . Le variabili sono non predefinite e devono avere "assegnazione definita" prima che vengano utilizzati.

Essenzialmente, quando si crea un oggetto (o si inizializza una struttura), azzera la memoria (o nel caso di un strutt ctor non predefinito, ti costringe a inizializzare manualmente tutto). Tuttavia, le variabili sono così comuni (in ogni metodo) che non vuole il sovraccarico di dover azzerare lo stack in ogni momento. Ti costringe invece a indicare il valore iniziale.

Altri suggerimenti

  

I numeri interi non sono impostati su 0?

Lo fanno quando sono membri dei dati di una classe, ma non quando sono una variabile locale: le variabili locali devono essere inizializzate esplicitamente prima di essere utilizzate, quindi l'errore del compilatore.

Quando crei un'istanza di una nuova istanza di una classe, tutta la memoria di cui l'oggetto ha bisogno viene "azzerata". gli ints sono impostati su 0, le stringhe sono impostate su null, ecc. Questo per evitare molti dei bizzarri bug e degli hack della memoria che erano possibili in C (++). Sfortunatamente questo ha anche un piccolo costo di elaborazione, quindi quando crei una variabile locale la lingua presume sia che imposterai il valore molto presto e non ti preoccuperai di azzerarlo per ridurre il numero totale di istruzioni richieste. Per compensare il rischio di utilizzare la memoria non impostata, vengono introdotti i controlli del compilatore per assicurarsi che sia stato impostato un valore prima che consentirà di utilizzare la variabile.

Ciò potrebbe essere dovuto al fatto che alla variabile dichiarata a livello di classe non è possibile assegnare un valore nello stesso ambito (diverso da quando si dichiara)

es

class Test
{
   int a;

   a = 0; // this is not allowed at class level & hence a initialized to default
}

, mentre

class Test
{
   void test()
   {
     int a;
     int b = a;

     a = 20; // this is allowed
   }
}

Come noto, quando dichiariamo una variabile in classe e creiamo un oggetto, il costruttore predefinito inizializza la variabile e quindi non è necessario inizializzare le variabili di classe. Ma arrivando ai metodi in classe non c'è alcun costruttore o altro per inizializzare quelle variabili, quindi non possiamo assegnare variabili non inizializzate nei metodi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top