2010-05-21 65 views
5

當從類外部訪問成員時,封裝顯然是有用的和必不可少的,但是在內部引用類變量時,最好是調用其私有成員還是使用它們的getter?如果你的getter只是返回變量,是否有任何性能差異內部使用屬性有什麼好處?

+1

試着問你自己這樣一個問題:如果你相信自己的陳述(我看不出有什麼理由你不應該)「封裝在類外部訪問成員時,顯然是有益的和必要的」,然後爭取來如果你刪除了最後四個單詞,爲什麼事情應該會有所不同呢?如果你不知道你可以使用相同的參數:) – 2010-05-21 18:55:48

+0

@ChrisF:那個線程幾乎完全不相關的這個問題 – fearofawhackplanet 2010-05-21 18:59:12

+0

鏈接到原來是一個不相關的問題刪除。 – ChrisF 2010-05-21 19:09:08

回答

9

不應該有顯着的性能差異,你堅持使用這些屬性的原因是因爲這就是封裝的全部要點。它使所有私人成員的訪問保持一致和受控。因此,如果您想更改屬性getter/setter,則不必考慮「是否需要在我決定直接訪問私有成員的地方的其他地方複製相同的功能?」

4

如果在獲取或設置中進行了驗證,則會受益。這將在一個地方,並始終呼籲。

據我所知(從其他問題的堆棧溢出),當Getter只是返回值時,生成的代碼與直接訪問變量相同。

7

直接訪問字段或使用getter通常不會產生很大的區別,除非您的getter執行一些延遲初始化或其他處理。所以這取決於吸氣劑的作用,但我的經驗法則是始終使用吸氣劑,除非在特定情況下。

要給字段賦值,不要忘記setter通常包含驗證碼或引發事件。在這種情況下,你應該總是使用setter。

+1

+1:這是一個很好的經驗法則。有一種使用私人成員的普遍傾向。「我沒有在吸氣劑和/或固色劑中做任何事情,因爲調用一種方法會是浪費......我只是做一個任務...很酷「。 (內疚......我承認)然後,後來你,或者更糟的是,其他人,爲二傳手加了一些驗證,並且......爆炸......你的目標對準了兔子會議的對手。像托馬斯說的那樣,總是有一個特殊情況下豁免的空間......習慣性地使用制定者。 – Rusty 2010-05-21 19:15:23

+0

無論如何,簡單的getter或setter通常由JIT編譯器內聯,所以它甚至不是直接訪問該字段的優化... – 2010-05-21 20:12:08

1

在大約98%的時間內,性能差異是可以忽略的。

即使您的getter或setter只是獲取或設置您的私有成員,您也應該始終使用屬性。這將允許您隨着應用程序的發展而帶來變化。這樣做,您將能夠在您的屬性中引入一些限制或其他封裝,而不會破壞您的代碼。否則,一旦你決定編寫屬性是因爲X的原因,你會發現自己有義務重構所有的代碼來獲取或設置屬性,而不是你的私有成員。

1

我喜歡使用內部屬性進行延遲初始化,其中在屬性中確保對象已初始化。這確保我沒有使用尚未初始化的類級變量。

TestClass1 _class1 
internal TestClass1 
{ 

get 
{ 

    if (_class == null) 
    _class = new TestClass1() 

    return _class1 

} 

} 
相關問題