2010-12-08 48 views
1

在C#中,如果我有以下代碼:是一個值類型,getter和setter仍然是一個值類型?

public int VarName { get; set; } 
  1. 請問VarName仍然是值類型?

  2. 是否會發生任何裝箱或拆箱?

  3. 存儲有關get/set的引用有任何開銷嗎?

+0

VarName是一個屬性,而不是一個類型。該屬性的後臺字段是一個純int。 – 2010-12-08 15:49:04

回答

2

getter和setter實際上是方法而不是字段。他們將設置一個int類型的支持字段(這是一個值類型)並返回相同的支持字段。

但是,編譯器(至少是微軟的那個)會優化這段代碼,並使內聯方法調用getter和setter方法,以便在屬性和使用公共字段之間的性能相同。

在類中使用屬​​性而不是公共變量總是首選。一個很好的理由是,如果在設置變量時突然需要進行一些驗證,則可以在不更改任何調用該類的代碼的情況下進行驗證,並且還可以只讓getter公開,以便任何訂戶你的課只能獲得價值而不能設置它。

+0

感謝您的回覆。所以就設置後臺字段而言,安全地說編譯器生成的IL代碼類似於:VarName.Get ()用於類型安全性和優化? – 2010-12-08 16:29:16

0

是的,它會,但是如果它是一個類的屬性,它將會堆積如山,並且不會出現裝箱和拆箱,直到您明確地在代碼中執行它。

3

是的,它仍然是一個值類型。

不,不會有任何拳擊或拆箱(因爲你不把它當作一個對象)。

不,沒有開銷,因爲你沒有存儲有關get/set的引用。它只是將int存儲在編譯器生成的後臺字段中。

1

請問VarName仍然是一個值類型?

是的。

還會發生任何拳擊或拆箱 ?

不,因爲參考類型和值類型之間沒有轉換。

存儲 有關get/set的引用是否有任何開銷?

否。C#編譯器會自動生成優化的get和set方法,它們分別檢索和設置編譯器生成的變量的值。將變量作爲屬性而不是公共字段公開是比較好的,這樣像數據綁定這樣的事情就可以正常工作,並且就像一般的最佳實踐一樣。

相關問題