2011-07-01 54 views
5

C#中的嵌套類型可以訪問父項的私有屬性。有這種語言功能的特定原因嗎?在我看來,這打破封裝。如果我使嵌套類型公開,那麼我將能夠通過它公開父類的私有屬性。通過C#中的嵌套類型訪問父項的私有屬性#

+3

糟糕的設計有無盡的可能性;沒有什麼會強制你使用它們。 –

回答

6

能夠 - 但你只能嵌套類,如果你在同一個源文件中的外部類放在第一位。

有效地,嵌套類由外部類「擁有」,並且信任與外部類的任何其他成員相同的程度。外部類中的方法也可以公開一個私有屬性 - 但你不相信它,因爲你擁有所有的代碼。同樣,你(外部類的作者)擁有嵌套類的所有代碼。如果你不想破壞嵌套類中的封裝,只需避免編寫破壞封裝的代碼:)

+5

我爲自己發佈了與@Jon Skeet相同的東西而感到自豪,雖然稍遜一籌,只是38秒後:) :) –

+1

感謝Jon。這清除了一切。有趣的是,在閱讀你書中的代碼片段之後,我有這個問題。 – Amrit

+0

我想你也可以通過部分類將外部類拆分爲兩個源文件,並讓其中一個源文件僅包含嵌套類,而另一個源文件包含其他所有內容。這是濫用部分類的東西;我建議不要這樣做。 – Brian

5

嵌套類是封閉類的一部分,就像方法一樣。通過它們暴露私有屬性並不會破壞封裝,而是通過方法暴露私有屬性。

C#用於訪問控制的模型是,您可以在您定義的類中訪問任何您想要的內容,並且很難看出它如何以其他方式工作。

2

(IMO)嵌套類型是封閉類型的一部分,所以它應該可以訪問private成員 - 就​​像該類型的任何其他部分一樣。

就像您製作public類型的任何其他部分一樣,這也可能暴露該類型的私有屬性。

由於只有寫封閉類型的人可以寫嵌套類型,所以沒有真正的風險嗎?