2009-03-28 17 views
7

In Java variabili di istanza può essere inizializzato da un blocco di inizializzazione come illustrato di seguito:C# equivalente di Java esempio di inizializzazione

class Example { 
    private int varOne; 
    private int varTwo; 

    { 
     // Instance Initializer 
     varOne = 42; 
     varTwo = 256; 
    } 
} 

Esiste un costrutto equivalente in C#?

[Modifica] So che questo può essere in linea con la dichiarazione della variabile di istanza. Tuttavia, sto cercando è qualcosa di simile al costruttore statico in C# ma per variabili di esempio.

+0

Punto di pedanteria: i blocchi di inizializzazione dell'istanza e l'inizializzazione del campo di istanza vengono eseguiti immediatamente dal costruttore * dopo * chiamando super. –

+0

@ Tom: hai ragione riguardo all'ordine chiamante. Il commento del codice sorgente è stato rimosso. – maxyfc

+0

Perché non basta renderlo un metodo e chiamarlo dal costruttore, se è quello che succede dietro la scena? – toxvaerd

risposta

5

Non c'è davvero alcun equivalente in C#. C# ha solo 2 modi per inizializzare esempio varibles

  1. Nel costruttore
  2. Con l'inizializzazione in modo esplicito la variabile al suo punto di dichiarazione

Non v'è alcun modo per fare un'inizializzazione dopo l'oggetto viene creato, ma prima che il costruttore funzioni.

7

Creare un costruttore di istanza che qualsiasi altro costruttore locale chiamerà nella lista di inizializzazione:

private Example() 
{ 
    //initialize all fields here 
} 

public Example (/*list of parameters*/) : this() 
{ 
    //do specific work here 
} 

Se il costruttore di default è già richiesto dalla logica dell'applicazione, quindi susbstitute

private Example() 

con

private Example (object dummy) 

e, naturalmente, di conseguenza modificare la chiamata di inizializzazione.

+0

sfortunatamente questo non ti permette di avere più blocchi di inizializzazione dell'istanza ... ma per il caso comune sarebbe ragionevole. – TofuBeer

+0

Curioso - che cos'è TofuBeer? e anche, perché vorresti più blocchi di inizializzazione dell'istanza? Per quest'ultimo - sembra che porti a confusione con i blocchi sparsi nel codice di classe, separati dai costruttori e separati dai decl dei membri. – Cheeso

+0

un esempio concrerte - c'è un campo privato readonly che ho bisogno di inizializzare in base ad alcuni metodi di classe che non sono disponibili all'inizializzazione statica. –

0

Se questo è ciò che si desidera per il caso specifico poi misura in cui è possibile è il seguente:

class Example { 
    public int varOne; 
    public int varTwo; 

    public Example(){ 
     Console.WriteLine("varOne : " + varOne + ", varTwo : " + varTwo); 
    } 

    public void getValues() 
    { 
     Console.WriteLine("varOne : " + varOne + ", varTwo : " + varTwo); 
    } 
} 

static void Main(string[] args) 
    { 
     Example e = new Example{ varOne = 42, varTwo = 256}; 
     e.getValues(); 
    } 

Qui, poi c'è un vincolo che si richiederebbe variabili di istanza per essere pubblico.