2010-06-09 58 views
12

如果我只將「protected」,「internal」和「private」成員(字段,方法,屬性,事件)保存在聲明爲「internal」的類中,那麼它會更具體一些嗎?在「內部」類中有「公共」成員是否是一種糟糕的編程習慣?

我已經看到這種做法(在「內部」類中有「公共」成員)在各種代碼中,所以只是想知道這是一種不好的做法,還是它有一些好處或優點。

[只關心C#] 感謝您的關注。

回答

8

不一定。如果你想隱式地實現一個接口,那麼公共成員比接受更多。

一般來說,如果班級是內部的,公衆成員沒有多大意義。你不會受到傷害,因爲你無法以定義模塊之外的強類型方式暴露類,但是如果你沒有隱式地實現一個接口,沒有太多的優勢。

+0

1;它真的讓我困擾,我們不能爲內部接口實現一個隱式的內部接口實現。 – 2010-06-09 14:56:04

+0

您可以將接口的成員實現爲私有方法。 http://ebersys.blogspot.com/2009/04/did-you-know-interface-members-are.html – Justin 2010-06-09 15:32:02

+0

@Julien Lebosquain:你是什麼意思?具有更爲明顯的內部接口的實現沒有多大意義。這就好像說一堂課可以同時是公開的和內部的。 – casperOne 2010-06-09 16:10:25

2

該類的internal規範限制了成員的public聲明的範圍,因此所有的公共成員實際上都是internal。也就是說,publicinternal的打字少很多,所以我的正常用法是將該類聲明爲internal,將公開的方法聲明爲public。我只標記一個成員internal,如果這個類是public,我想限制一些成員到同一個程序集。

+2

'少了很多打字'作爲選擇語言關鍵字的參數;顯然這個答案不是美國速度打字員協會贊助的 – 2010-06-09 15:19:11

1

我知道的唯一功能原因是隱式實現接口。所有接口方法必須使用public進行標記,以便與接口匹配。即使類型或接口不公開,也是如此。

除了這種有限的情況,我真的不喜歡這種做法。這樣做會讓你的應用程序的公共表面區域變得更難一些。相反,你必須進行更高級的搜索。

此外,它可能會讓我困擾一些不合理的方式,即成員標記爲公開時,他們確實不公開。

+0

讓你想知道爲什麼編譯器沒有被優化成將公衆降級到內部,或者當沒有使用接口方法時發出警告。沒有提供編譯器警告或提供的信息(Fx 3.5)似乎對我來說真的很奇怪,並讓我懷疑是否沒有其他的原因,我們還沒有被允許。 – 2010-06-09 15:26:55

+0

@jdk,希望Eric稍後可以評論爲什麼,但我的猜測是編譯器沒有警告,因爲它實際上並不正確。 CLI確實允許這種類型的可訪問性不一致,因此除非有特定的業務理由否認它,否則C#團隊決定將其資源花費在其他地方。 – JaredPar 2010-06-09 15:39:36

+0

我們需要像蝙蝠俠那樣的召喚埃裏克按鈕,但我認爲它會被濫用。 – 2010-06-09 17:28:58

0

我試圖想象當我設置方法修飾符時類訪問修飾符發生改變的可能性。如果一個方法需要在內部,即使這個類是公開的,我會這樣說。如果沒有,那麼這個方法就是公開的。

2

這就是我所做的。當我的大腦認爲「這個成員應該可以接近」時,我不能自救,我的手指無法控制地開始捶打。當我宣佈課程時沒有這樣的問題。

一個巨大的優勢:使內部類公開的重構(或者相反的方式)需要改變一個單詞。而微軟也是這樣做的。

5

假設這些公共成員仍然是類的公共接口的一部分,即使類本身具有內部作用域也是合理的。當我看到一個班級成員有internal時,這對我來說就是「有點狡猾的後門訪問表達緊密耦合,而public仍然意味着在我心中有適當的防禦性編程責任。這純粹是一個概念上的區別。

+2

+1恕我直言,公開課的內部成員半封裝。除非絕對必要,否則我會避免它們(我發現這很少見)。 – 2010-06-09 17:02:40

+0

當我發現自己使用內部成員時,通常意味着我正在混合表示數據,並以複雜,有狀態的方式處理這些數據。我最近做了一次重大的重構,以移除這種有狀態的處理(隱藏爲「內部」),這些處理從未被存儲爲正在處理的類的一部分。 – 2010-06-09 17:31:59

0

我會說是的,這是不好的編程習慣。

這不僅僅是控制訪問。這也是關於使代碼更加模塊化。

如果對象數據的使用者想要某些對象的數據,則它會調用getter方法。如果稍後要返回的數據應該不同,程序員只需要在一個地方更改代碼,而不是所有讀取數據的地方(如果該成員是公開的)。這與爲什麼我們應該編寫函數/方法並調用它們而不是僅僅複製和粘貼關於該地點的代碼相似。

解釋在這裏的一個示例: http://www.programmingincpp.com/private-versus-public-data-members-in-a-class.html

相關問題