以下的.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,初見大驚小怪,有失老鳥的端莊儀態,見笑了。也再次證明 -- 學海無涯啊~~~