摘要:internal、Friend的存取範圍
因為一些需求的關係,使我需要在ASP.NET的專案的App_Code上寫些類別來提供一些功能給網頁使用,
因為只在這個專案上使用的類別,所以基於最小權限原則,我將存取範圍設定為Friend,
這個想法是基於,Friend或internal存取修飾詞的作用範圍在專案的範圍,
不過,很快地就遇到了問題了,我在網頁上無法存取我所設計好的類別,
發生了什麼事?
我檢查了一下程式碼,第一個發現的是,類別所處的名稱空間跟網頁不同,
印象中C#的internal應該是與VB的Friend是同等效用的,
而我使用internal的經驗,其可存取的範圍應該是與名稱空間是無關的,
而是與專案有關,同專案的物件可以存取到宣告為internal的物件,
難道,VB的Friend不是如此?
不過,很快地,我想到我以前開發時都是使用ClassLibrary的專案類型,而現在使用的是WebSite,
那這樣的話,我使用C#開WebSite專案,或許會碰到一樣的狀況,
果不其然,一樣地,存取不到internal的類別,
這樣的情形讓我覺得,這跟WebSite編譯的方法有關,
最後上MSDN查了internal、Friend的說明,
internal 關鍵字是型別和型別成員的存取修飾詞。內部型別或內部成員只能在相同組件中的檔案內存取internal 關鍵字是型別和型別成員的存取修飾詞。內部型別或內部成員只能在相同組件中的檔案內存取。
編譯成相同組件之其他類別、結構和模組的程式碼,都可以存取該組件中的所有 Friend 項目。
嗯嗯,intenal果然等效於Friend,
會發生這意料之外的事情的原因是在於我的認知,
因為WebSite會將App_Code底下的程式碼編譯成一個組件,而與網頁是分開的,
這樣的話,宣告為Friend的類別,網頁的程式碼當然不能存取到,
關鍵就是,相同組件。
而會誤解的原因是過去我的設計都是在ClassLibrary上完成,而ClassLibrary專案會將程式碼編譯成一個組件。
這樣的結果,我反而覺得不錯,過去我一直以為在WebSite當中,因為是同一個專案,所以利用存取修飾詞的效果並不好,
很難有效地隱藏些資訊,來簡化存取,而現在,原來還是可以利用些存取範圍限制來做些隱藏,這樣就可以考慮到一些物件使用的技巧了。