2016-04-08 11 views
19

Sto rivedendo del codice con un modello di inizializzazione dell'oggetto che non riconosco - qualcuno può dirmi come si chiama questo modello (e dove trovare la documentazione sull'uso)?Come si chiama questo modello di inizializzazione di oggetto?

obj.myType = (myVar = new MyType()); 

Nel caso specifico, il caso d'uso specifico è il seguente;

protected MyType myVar; 
protected readonly MyComplexType myComplexType; 

protected void Page_Init(object sender, EventArgs e)) { 
    ... 
    myComplexType.myType = (myVar = new MyType()); 
    ... 
} 
+1

un esempio di questo sono i campi pigri: 'get {return FLD ?? (fld = new C()); } '. Una volta abituato a questo, è una scorciatoia piacevole e concisa. – usr

+2

Chiamerei questo modello "codice errato" – Mick

risposta

19

E 'solo assegnando lo stesso valore due volte - una volta per myVar e una volta a myComplexType.myType.

E 'equivalente a

var tmp = new MyType(); 
myVar = tmp; 
myComplexType.myType = tmp; 

(In alcuni casi complessi non ci può essere di tipo conversioni succedendo lì, ma non mi aspetto che ci sia alcuna in questo caso particolare.)

È don Non è necessario utilizzare la variabile locale extra, ovviamente. Questo codice è "un po 'equivalente" ma coinvolge la lettura da myVar quindi non è esattamente equivalente, ma più probabile che sia quello che ci si usa:

myVar = new MyType(); 
myComplexType.myType = myVar; 

Non c'è alcun nome specifico per questo, ed è relativamente rara di utilizzare il risultato di un incarico altrove in un'espressione, con l'esempio più comune è:

string line; 
while ((line = reader.ReadLine()) != null) 
{ 
    ... 
} 
+1

Quindi suppongo che non ci sia motivo di usarlo? – smoksnes

+6

@smoksnes: Beh, è ​​un modo più breve di assegnare lo stesso valore a due variabili ... se lo preferisci alla lunga o no è una questione diversa. –

+1

Preferisco la leggibilità quindi per uno schema raro come questo devo concordare con @smoksnes –

Problemi correlati