【笨問題】紅杏出牆的internal類別

以下的.NET專案,有什麼不合理之處?

.NET開發者都知道,.NET有四種存取層級: public、private、protected及internal。public是公開對外、private只限同類別內存取、protected對繼承的子類別開放、而internal則只對同一Assembly內的其他的型別公開。在接手維護的專案看到如上述圖片的奇蹟: 有顆DLL宣告為internal的類別,卻大大方方地在另一顆DLL登場,如同public類別一樣被宣告使用,跨越了Assembly的藩籬,顛覆我對internal的認知,目瞪口呆之餘脫口而出 -- 花惹發!

以為是什麼密技魔法,追了好一陣子才想起,啊! Friend Assembly~

這是.NET 2.0起就支援的特性,為Assembly加上[assembly: InternalsVisibleTo("AnotherAssembly")],AnotherAssemly就會被當成自己人,允許存取標為internal的型別及成員。這個技巧常被應用在單元測試,解決測試程式無法存取internal成員的困擾。依據MSDN的說法,Friend Assembly主要有兩種用途:

  • 在單元測試期間,測試程式碼在另一個組件中執行,但是需要存取所測試組件中的成員,此時可以將該成員標記為 Friend (Visual Basic) 或 internal (C#)。
  • 您在開發類別庫時,類別庫的附加功能包含在不同組件中,且需要存取現有組件中的成員,此時可以將該成員標記為 Friend (Visual Basic) 或 internal (C#)。

這回遇到的顯然是後者。寫.NET程式十年有餘,卻沒見過野生的Friend Assembly,初見大驚小怪,有失老鳥的端莊儀態,見笑了。也再次證明  -- 學海無涯啊~~~

歡迎推文分享:
Published 19 September 2013 07:42 AM 由 Jeffrey
Filed under:
Views: 19,281



意見

# Will said on 18 September, 2013 08:40 PM

回報錯字:

[assembly: InternalsVisibleTo("AnothorAssembly")]

應改成:

[assembly: InternalsVisibleTo("AnotherAssembly")]

# 91 said on 19 September, 2013 06:22 AM

www.dotblogs.com.tw/.../learning-tdd-in-30-days-day4-why-you-should-not-write-unit-test-with-private-and-protected-method.aspx

還好我之前在寫測試程式的時候,針對 internal 的測試已經撞過一次牆了 XD

# Jeffrey said on 21 September, 2013 07:16 AM

to Will, 感謝校正。黑大再次展現了捍衛"錯字天王"寶座的決心!! orz

to 91, 中肯! 我想這題可以當作面試新人是否具備.NET單元測試實務經驗的考題。

# 91 said on 23 September, 2013 10:36 AM

to 黑大,

可是我也很少碰到知道 internal 意義的 candidate 耶...

很多人都是一路 public 下去的...

你的看法呢?

(必要的) 
(必要的) 
(選擇性的)
(必要的) 
(提醒: 因快取機制,您的留言幾分鐘後才會顯示在網站,請耐心稍候)

5 + 3 =

搜尋

Go

<September 2013>
SunMonTueWedThuFriSat
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345
 
RSS
創用 CC 授權條款
【廣告】
twMVC
最新回應

Tags 分類檢視
關於作者

一個醉心技術又酷愛分享的Coding魔人,十年的IT職場生涯,寫過系統、管過專案, 也帶過團隊,最後還是無怨無悔地選擇了技術鑽研這條路,近年來則以做一個"有為的中年人"自許。

文章典藏
其他功能

這個部落格


Syndication