2012-11-15 5 views
6

Qual è la differenza tra i due casi di seguito:Qual è la differenza nel modo in cui questi oggetti vengono istanziati?

class Data 
{ 
    PersonDataContext persons = new PersonDataContext(); 
    public Data() {} 
} 

contro

class Data 
{ 
    PersonDataContext persons; 
    public Data() 
    { 
     persons = new PersonDataContext(); 
    } 
} 

Ho la stessa domanda in asp.net:

public partial class Data : System.Web.UI.Page 
{ 
    PersonDataContext persons = new PersonDataContext(); 
    protected void Page_Load(object sender, EventArgs e) 
    { 
    } 
} 

contro

public partial class Data : System.Web.UI.Page 
{ 
    PersonDataContext persons; 
    protected void Page_Load(object sender, EventArgs e) 
    { 
     persons = new PersonDataContext(); 
    } 
} 

risposta

3

Gli inizializzatori di campo vengono eseguiti prima della chiamata del costruttore. Quindi, nel caso 1, il tuo oggetto PersonDataContext verrà creato prima della chiamata del costruttore.

PersonDataContext persons = new PersonDataContext(); 

In secondo caso, il costruttore eseguirà prima e poi si inizializza campo.

Si può fare un semplice test

class PersonDataContext 
{ 
    public PersonDataContext() 
    { 
     Console.WriteLine("In PersonDataContext Constructor"); 
    } 
} 
class Data 
{ 
    PersonDataContext persons = new PersonDataContext(); 
    public Data() 
    { 
     Console.WriteLine("In Data Contructor"); 
    } 
} 

class Data2 
{ 
    PersonDataContext persons; 
    public Data2() 
    { 
     Console.WriteLine("In Data2 Constructor"); 
     persons = new PersonDataContext(); 
    } 
} 

e poi nel metodo principale

static void Main(string[] args) 
{ 

    Data d1 = new Data(); 
    Data2 d2 = new Data2(); 
    Console.Read(); 
} 

uscita

In PersonDataContext Constructor // Caso 1

In Data Contructor // Caso 1

In Dati2 Constructor // Caso 2

In PersonDataContext Constructor // Caso 2


Per l'esempio asp, Nel primo caso il vostro campo è inizializzato prima dell'evento Page_Load, e in Secondo caso il tuo campo viene inizializzato nell'evento Page_Load

+0

Capisco perfettamente. Grazie per il tuo esempio. – megazero

+0

Siete i benvenuti @jerry – Habib

4

Nel primo caso si inizializza la variabile nel sito di dichiarazione.

Nel secondo, lo si inizializza in un costruttore.

La differenza principale è che se si dispone di costruttori aggiuntivi e si dimentica di inizializzare o concatenare i costruttori, è possibile avere una variabile non inizializzata.

+0

bene, una variabile inizializzata di default (T), che è nullo per i tipi di riferimento. .in C# non è possibile mantenere una variabile non inizializzata (così facile). – eFloh

2

L'unica differenza è l'ordine in cui vengono creati gli oggetti. Se ricordo bene, l'inizializzatore dei campi viene eseguito prima del costruttore, così che se il costruttore fa riferimento al campo, è già lì.

Ma dal 99,9% del caso, non vedrai una differenza tra i due. Nella maggior parte dei casi, è più sicuro inizializzare il campo direttamente su di esso, impedendoti di dimenticarlo in caso di più costruttore o classe derivata e gerarchia complessa.

Spesso i costruttori vengono utilizzati per eseguire parametri esterni per compilare campi che non possono essere con l'inizializzatore di campo.

+0

Una buona esperienza per me. Inizializzatori di campo direttamente su di esso, grazie mille. – megazero

0

Avrai unintialized variable for second case se usi un costruttore diverso dal costruttore predefinito per oggetto inizializzazione -

Data data = new Data(5); 

Ma se si chain parametized constructors to call default constructor come questo -

class Data 
{ 
    PersonDataContext persons; 
    public Data() 
    { 
     persons = new PersonDataContext(); 
    } 

    public Data(int a) : this() 
    { 

    } 
} 

variabile persons verranno inizializzate.

0

Nel primo esempio non ci sarà alcuna differenza effettiva finchè il Constructor è l'unico Costruttore. Se aggiungi altri costruttori, devi assicurarti che inizializzino tutti il ​​campo "persone".

Nell'esempio ASP.NET (per il secondo snippet di codice) - stai inizializzando il campo "persone" nel metodo Page_Load, il che significa che qualsiasi altro metodo che utilizza questo campo potrebbe trovarlo non inizializzato. (Intendevi Page_Load, o intendevi renderlo un Costruttore ...?)

La linea di fondo è, se il campo "persone" deve sempre essere non nullo, è più sicuro inizializzare come Inizializzatore campo ...

3

Nel secondo esempio, la differenza principale è che Page_Load è solo uno degli eventi ASP.NET chiamati durante l'elaborazione della richiesta. Di conseguenza, gli eventi generati prima di Page_Load non saranno in grado di accedere/utilizzare questo campo, perché non è ancora stato inizializzato.

Controllare la pagina ASP.NET ciclo di vita: http://msdn.microsoft.com/en-us/library/ms178472%28v=vs.100%29.aspx

Problemi correlati