2016-04-08 10 views
19

Przeglądam jakiś kod z wzorcem inicjalizacji obiektu, którego nie rozpoznaję - czy ktoś może mi powiedzieć, jak nazywa się ten wzorzec (i gdzie znaleźć dokumentację na temat użycia)?Co to jest ten wzorzec inicjalizujący obiekt?

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

W przypadku, który ma znaczenie, konkretny przypadek użycia jest następujący;

protected MyType myVar; 
protected readonly MyComplexType myComplexType; 

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

Jedna instancja tego pola są leniwe: 'get {return FLD ?? (fld = new C()); } '. Kiedy już się do tego przyzwyczaisz, jest to miły, zwięzły skrót. – usr

+2

Nazwałbym ten wzorzec "złym kodem" – Mick

Odpowiedz

19

To właśnie przypisanie tej samej wartości dwukrotnie - raz do myVar i raz do myComplexType.myType.

To odpowiednik

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

(W niektórych skomplikowanych przypadkach może być typu konwersje tam dzieje, ale nie spodziewam się tam, aby być dowolna w tym konkretnym przypadku.)

don Oczywiście musisz użyć dodatkowej zmiennej lokalnej. Ten kod jest „nieco równoważne”, ale wiąże się z czytania myVar tak nie jest dokładnie równoważne, ale bardziej prawdopodobne jest to, czego można użyć:

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

Nie ma specyficzna nazwa dla tego, i to stosunkowo rzadkie użycie wyniku cesji gdzie indziej w wyrażeniu z najczęstszych przykład samopoczucie:

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

Więc wydaje mi się, że nie ma powodu, aby z niego korzystać? – smoksnes

+6

@smoksnes: Cóż, jest to krótszy sposób przypisania tej samej wartości dwóm zmiennym ... niezależnie od tego, czy wolisz ją do longhand, czy nie, to inna sprawa. –

+1

Jestem zwolennikiem czytelności, więc w przypadku tak rzadkiego wzoru muszę zgodzić się z @smoksnes –