簡體   English   中英

c#使用基類的setter或getter

[英]c# using setters or getters from base class

是否建議將基類的成員變量設置為protected,以便子類可以訪問這些變量? 或者是否更建議將成員變量設置為private並讓子類通過getter和setter獲取或設置變量?

如果建議使用getter和setter方法,何時使用受保護的變量?

此問題非常相似 ,關於是否通過屬性或直接訪問訪問同一類中的信息。 這也許值得閱讀所有這些答案。

就個人而言,我不喜歡任何字段是非私有的,偶爾會出現具有不可變值的靜態只讀字段(無論是否為const)。 對我而言,屬性只是提供更好的封裝程度。 數據的存儲方式是實現決策,而不是API決策(與屬性不同)。 為什么類Foo派生於Bar類關心類Bar的實現

簡而言之,我總是尋找屬性,除了一次性測試代碼之外我不會使用受保護的變量。

通過在C#3.0中自動實現的屬性,將字段轉換為屬性比以往更容易。 沒有理由去做。

其他程序集中的類可以從未密封的類派生,並可以訪問受保護的字段。 如果有一天您決定將這些字段設置為屬性,則需要重新編譯其他程序集中的那些類以使用新版本的程序集。 這被稱為“打破二進制兼容性”,也許是你不應該在程序集之外公開字段的一個堅實原因。

這是一個權衡。 Setter和getter比直接訪問字段慢一些,所以如果你在子類中進行大量的數學運算和讀/寫這些字段,你應該直接訪問字段。 但這更像是一個例外。

通常情況下,您應該將它們標記為私有,然后選擇getter / setter。

所以我的答案是:直接訪問頻繁使用的字段,否則為getter / setter。 使用常識。

編輯:我做了一些分析,顯然甚至在發布模式下,字段和屬性之間的速度差異可達20%。 請在此處查看我的測試用例: http//pastebin.com/m5a4d1597

我必須同意喬恩。

但是,在某些情況下,我有時會將保護變量用於“最頂層”的繼承類。 例如,如果你有一個readonly對象並且你不能將它設置回來但是你可以在子類中使用它,我不明白為什么我應該有一個受保護的Get來訪問該變量。 一個簡單的受保護變量執行相同的封裝,因為您無法設置此變量,並且只能從子類訪問此變量。

但是set / get是其他情況的方法。

暫無
暫無

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

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