9

給出下面的例子,客觀上比另一個更好/更快/更安全嗎?對象字面實例化應該是一個最實際的實踐嗎?對象文字實例化比設置屬性更快嗎?

這不合適嗎?

class Person 
{ 
    public string name; 
    public int age; 
} 
void MakePeople() 
{ 
    Person myPerson = new Person(); 
    myPerson.name = "Steve"; 
    myPerson.age = 21; 

    Person literalPerson = new Person { name = "John", age = 22 }; 
} 
+3

從這兩種方法生成的IL應該是相同的。所以不行。 – 2012-08-15 19:32:23

+2

一條線而不是三條,意圖和效果更清晰。它可能慢10倍,它仍然是一個好主意。我無法理解人們對微小性能差異的注意(作爲默認方法;我很樂意微觀優化熱點)。 – delnan 2012-08-15 19:33:38

回答

16

不,它不會更快或更慢。這是相同的。

編譯器將對象初始值設定項轉換爲構造函數調用,然後設置這些屬性。

Person literalPerson = new Person { name = "John", age = 22 }; 

打開到:

Person myPerson = new Person(); 
myPerson.name = "John"; 
myPerson.age = 22; 

你應該使用什麼是更具可讀性和你有什麼與你的團隊達成一致。

+2

+1使用什麼更可讀(尤其是團隊環境) – JYelton 2012-08-15 19:36:43

+5

從技術上講,它不完全相同,因爲編譯器聲明一個臨時變量,以保留賦值給您的變量原子。 – 2012-08-15 19:37:20

+0

@KirkWoll即使在'Person'是一個引用類型的上述情況下,情況是否如此? – 2012-08-15 19:44:36

0

如果你看看生成的IL,我敢肯定你會發現它們是相同的。使用對象初始化器只是一個編譯器快捷方式。

1

兩者都適用。這取決於你需要做什麼來設置屬性。例如,我會避免在案件字面實例,其中需要一些邏輯,在屬性值到達:

Person myPerson = new Person(); 
myPerson.SomeProperty = if IsNewPerson ? GetPropertyFromDatabase() : GetDefaultProperty(); 

編輯:

一個優點在Visual Studio中使用文本對象的初始化是智能感知將提示屬性,只顯示尚未聲明的屬性。 (我已經跑到代碼中,在設置屬性時值被重複分配)。

+1

雖然這只是個人偏好。你仍然可以使用文字初始化。 – Servy 2012-08-15 19:34:12

+0

你可能會得到更少的可讀性。 – JYelton 2012-08-15 19:34:24

+0

可讀性是一個偏好問題。我的觀點並不是這是壞的,只是生成的代碼仍然是相同的,即使在你的例子中。 – Servy 2012-08-15 19:34:57

0

我不認爲速度應該是推動這個決定的原因。兩種方法的速度之間可能差別很小。

我認爲代碼的可讀性應該是你走哪條路的主要因素。使用這個標準,我認爲他們非常接近,並且歸結爲個人偏好或任何你的團隊決定。然而,我認爲在一個對象的情況下需要設置許多屬性,明確地調用setter更具可讀性。