2017-06-20 74 views
1

假設我構成一個對象,其屬性,需要從在方法確定的其它值,例如轉換:(其中,此在C#中,類的屬性是並行還是按順序初始化?

var var1; 
var var2; 

//do stuff with var1 and var2 

MyClass myClass = new MyClass 
{ 
    Property1 = var1, 
    Property2 = var2 
}; 

如果MyClass屬性都評估,並設置在同一時間是可能的),我認爲這可能是更有效的下放是設置var1var2分離方法的操作,就像這樣:

MyClass myClass = new MyClass 
{ 
    Property1 = SetProperty1(), 
    Property2 = SetProperty2() 
} 

private static object SetProperty1() 
{ 
    //do stuff 
} 

private static object SetProperty2() 
{ 
    //do stuff 
} 

但是,如果每個屬性是爲了評估(如一個步進時看到通過這樣的代碼),任何這樣的好處從爆發出新的方法就失去了。

編輯對象的屬性是否同時初始化,或按順序?

+0

他們的順序初始化指定的任務。 –

+2

計算機並不擅長處理事務,除非您希望您的對象由多個線程設置。 – Enigmativity

+0

@Enigmativity計算機*非常善於同時處理事務。即使只有一個線程,它也可能花費很少的時間只能一次執行單個操作。它所做的就是努力確保同時運行各種操作的行爲無法與完全按順序運行時會發生的情況明顯區分開來,從而允許程序員編寫代碼*就像程序依次運行所有內容一樣,因爲編寫併發代碼非常困難*對於程序員來說*(正確),即使它對計算機來說非常簡單*。 – Servy

回答

14

瞭解這裏發生的事情很重要。

本聲明:

MyClass myClass = new MyClass 
{ 
    Property1 = var1, 
    Property2 = var2 
}; 

實際上編譯成這樣:

MyClass temp = new MyClass(); 
temp.Property1 = var1; 
temp.Property2 = var2; 
MyClass myClass = temp; 

其原因臨時變量是,如果你的而不是分配到一個局部變量,分配給屬性,該屬性將不包含中途初始化的對象。一旦初始化完成,它將只接收對象實例。

因此,要回答你的問題,對象初始化將分配屬性值的順序,而且在你寫的順序,而不是在爲了相應屬性在類型定義,如果這是不同的。這是因爲它可能是重要的,分配屬性的副作用可能有,但我會建議反對創建具有這種副作用的對象,因爲它們可能非常脆弱。

然而,任何代碼檢查myClass變量(或字段或屬性)要麼看到舊值(可能null),或完全(根據你的分配)分配的對象。


截至如果你沒有使用這個臨時變量會發生什麼一個例子:

MyClass myClass = new MyClass(); 
// what if some other code can access myClass here, because you're really 
// assigning to a property or to a field? 
myClass.Property1 = var1; 
// then this assignment above wouldn't be done yet 
... 
+0

這是一個非常徹底和有益的迴應! Tusen takk! – JAF

0

只是像其他人說:性質在您指定的任務的順序初始化。

你可以試試這個:

class MyClass 
{ 
    private object _property1; 
    private object _property2; 

    public object Property1 
    { 
     get 
     { 
      return _property1; 
     } 

     set 
     { 
      Console.WriteLine("Property1 set"); 
      _property1 = value; 
     } 
    } 

    public object Property2 
    { 
     get 
     { 
      return _property2; 
     } 

     set 
     { 
      Console.WriteLine("Property2 set"); 
      _property2 = value; 
     } 
    } 
} 

這是產生大約什麼,當你使用public object Property { get; set; }語法。除Console.WriteLine

當你使用這個類是這樣的:

MyClass myClass = new MyClass 
{ 
    Property2 = 1, 
    Property1 = "a" 
}; 

輸出將是:

Property2 set 
Property1 set