簡體   English   中英

具有getter和setter的值類型仍然是值類型嗎?

[英]Is a value-type with getters and setters still a value-type?

在C#中,如果我有以下代碼:

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

  2. 會發生裝箱或拆箱嗎?

  3. 存儲與get / set有關的引用是否有開銷?

是的,它仍然是值類型。

不,不會進行裝箱或拆箱(因為您沒有將其視為對象)。

不,沒有開銷,因為您沒有存儲與get / set有關的引用。 它只是將int存儲在編譯器生成的后備字段中。

getter和setter實際上是方法,而不是字段。 他們將設置int類型的后備字段(即值類型),並返回相同的后備字段。

但是,編譯器(至少是Microsoft編譯器)將優化此代碼,並內聯調用getter和setter的方法,以使屬性與使用公共字段之間的性能相同。

始終首選在類中使用屬​​性而不是公共變量。 這樣做的一個很好的理由是,如果您在設置變量時突然需要進行一些驗證,則可以在不更改調用該類的任何代碼的情況下進行驗證,並且還可以僅將getter公開,以便任何訂閱者您的班級只能獲取該值,而不能設置它。

VarName仍然是值類型嗎?

是。

還會進行裝箱或拆箱嗎?

不,因為在引用類型和值類型之間沒有轉換。

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

否。C#編譯器自動生成優化的get和set方法,這些方法除了分別檢索和設置編譯器生成的變量的值外,什么也不做。 通常最好將變量公開為屬性而不是公共字段,以使諸如數據綁定之類的事情正常工作,並作為一般的最佳實踐。

是的,它會,但是,如果它是一個類的屬性,它將繼續堆放,並且也不會發生裝箱和拆箱,直到您在代碼中顯式地進行裝箱為止。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM