以下的.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 下去的...

Post a comment