【笨問題】紅杏出牆的internal類別
4 |
以下的.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,初見大驚小怪,有失老鳥的端莊儀態,見笑了。也再次證明 -- 學海無涯啊~~~
Comments
# by Will
回報錯字: [assembly: InternalsVisibleTo("AnothorAssembly")] 應改成: [assembly: InternalsVisibleTo("AnotherAssembly")]
# by 91
http://www.dotblogs.com.tw/hatelove/archive/2012/11/09/learning-tdd-in-30-days-day4-why-you-should-not-write-unit-test-with-private-and-protected-method.aspx 還好我之前在寫測試程式的時候,針對 internal 的測試已經撞過一次牆了 XD
# by Jeffrey
to Will, 感謝校正。黑大再次展現了捍衛"錯字天王"寶座的決心!! orz to 91, 中肯! 我想這題可以當作面試新人是否具備.NET單元測試實務經驗的考題。
# by 91
to 黑大, 可是我也很少碰到知道 internal 意義的 candidate 耶... 很多人都是一路 public 下去的...