2010-03-12 8 views
26

Classe A utilizza un elenco di inizializzatori per impostare il membro sul valore del parametro, mentre la Classe B utilizza l'assegnazione all'interno del corpo del costruttore.Quando si inizializza in costruttori C# cosa c'è di meglio: elenchi di inizializzazione o assegnazione?

Qualcuno può dare una ragione per preferire uno sopra l'altro fintanto che sono coerente?

class A 
{ 
    String _filename; 

    A(String filename) : _filename(filename) 
    { 
    } 
} 


class B 
{ 
    String _filename; 

    B(String filename) 
    { 
     _filename = filename; 
    } 
} 

risposta

67

Il primo non è legale in C#. Gli unici due elementi che possono apparire dopo i due punti in un costruttore sono base e this.

Quindi vorrei andare con il secondo.

+9

Grazie, provenendo da C++ mi chiedevo se la sintassi A (elenco di inizializzazione dei membri) fosse valida anche per C#. –

15

Intendevi C++ anziché C#?

per C++, le liste di inizializzazione sono meglio di assegnazione per un paio di motivi:

  • Per i tipi di POD (int, float, ecc ..), l'ottimizzatore può spesso fare un memcpy più efficiente dietro le quinte quando si forniscono gli inizializzatori per i dati.
  • Per i tipi non POD (oggetti), si ottiene efficienza solo facendo una costruzione. Con l'assegnazione nel costruttore, il compilatore deve prima costruire il tuo oggetto, quindi assegnarlo in un passaggio separato (questo vale anche per i tipi di POD).
0

C# ha una funzionalità denominata Object Initializer. È possibile fornire valori che il compilatore utilizzerà per inizializzare i membri specificati e chiamare il costruttore predefinito. Per far funzionare questo è necessario disporre di un costruttore pubblico predefinito.

Problemi correlati