C#中的Internal關鍵字小結
首先,理清幾個概念:項目(project)、解決方案(solution)、程序集(assembly)、命名空間(namespace)。
項目(project) 就是我們開發(fā)的一個軟件。.NET下,項目有多種類型,如控制臺、Windows應用程序、類庫、Web應用程序等等。經(jīng)過編譯后,會生成.exe文件和.dll文件。 .exe文件有統(tǒng)一的主程序入口,可以被執(zhí)行,而類庫只是提供一些功能給其他項目調(diào)用。
解決方案(solution) 當我們在VS中新建任何一種類型的項目時,這個項目還屬于一個解決方案。當我們的業(yè)務相對簡單時,解決方案所發(fā)揮的作用并不是很大。但當我們開發(fā)復雜的軟件時,需要多個模塊組成。比如說開發(fā)中常用的三層架構,U層是一個簡單的windows應用程序(項目的一種類型),B、D層由多個類庫(項目的另一種類型)組成。通過一個解決方案,我們就可以將其多個項目組合起來,完成我們的開發(fā)。形象地說,解決方案就是一個容器,在這個容器里,分成好多層,好多格,用來存放不同的項目。換句話來說就是:程序集就是一個項目,多個項目構成一個解決方案。
程序集(assembly) 一個項目就是一個程序集。一個程序集可以體現(xiàn)為一個dll文件,或者exe文件。
命名空間(namespace) 主要是為了避免一個項目中,可能會存在的相同對象名的沖突。
從編輯上來說,命名空間僅僅是在類型名稱前加了一些由點號隔開的符號而已,這使得一個類型的名稱更長,從而也更具惟一性。如果兩個相同的類在同一個命名空間則會沖突,如果不同的命名空間有相同的類型,也會產(chǎn)生二義性。
注意,C#的using指示符會指示編譯器試著在類型名上添加不同的前綴,直到找到一個匹配為止。命名空間只是邏輯上,真正的類型在程序集里。當查找一個類型的定義時,編譯器必須被告知到哪些程序集中進行查找,編譯器將掃描它知道的所有程序集來查找類型的定義。一旦編譯器找到了正確的程序,程序集信息和類型信息會被添加到生成托管模塊的元數(shù)據(jù)中。
重要提示:CLR不知道命名空間的任何事情。訪問一個類型時,CLR需要知道類型的完整名稱(這可能是一個相當長、包含句點符號的名稱)以及該類型的定義具體在哪一個程序集中。這樣一來,“運行時”才能加載正確的程序集,找到目標類型,并對其進行操作。
聯(lián)系與區(qū)別:
命名空間是類庫的邏輯組織形式,程序集就是類庫的物理組織形式
一個程序集內(nèi)可能有多個命名空間,一個命名空間可能存在于不同的程序集中
程序集是實現(xiàn)類型的文件,編譯之后生成的。命名空間是對類型的邏輯分組。
C#編譯器可能比較關心命名空間,因為它需要確定類的完整名稱,然后交給CLR。CLR只關心程序集,會通過類的完整名稱加載對應的程序集
總結:
通過在項目中使用分部類,發(fā)現(xiàn)可以通過分部類實現(xiàn)對這個類的擴充和完善。而使用分部類時我們會對命名空間進行修改,進而將類進行擴展,這就是我們說的一個命名空間可以存在于不同的程序集。通過項目去不斷成長,努力去做,《關于分部類的介紹可以訪問下面地址:https://msdn.microsoft.com/zh-cn/library/wa80x488.aspx 》
1、internal(內(nèi)部):限定的是只有在同一程序集中可訪問,可以跨類
protected(受保護):限定的是只有在繼承的子類中可訪問,可以跨程序集
protected internal:受保護“或”內(nèi)部修飾符修飾成員,當父類與子類在同一個程序集中,internal成員可見。當父類與子類不在同一個程序集中,子類不能訪問父類internal成員,而子類可以訪問父類的ptotected internal成員,
即,從當前程序集或從包含類派生的類型,可以訪問具有訪問修飾符protected internal的類型或成員。
2、internal關鍵字是類型和類型的成員訪問修飾符。只有在同一程序集的文件中,內(nèi)部類型或成員才是可訪問的。內(nèi)部訪問通常用于基于組件的開發(fā),因為它使一組組件能夠以私有方式進行合作,而不必向應用程序代碼的其余部分公開。例如,用于生成圖形用戶界面的框架可以提供Control和Form類,這兩個類通過使用具有內(nèi)部訪問權限的成員進行合作。由于這些成員是內(nèi)部的,它們不向正在使用框架的代碼公開。
3、從定義具有內(nèi)部訪問能力的類型或成員的程序集外部引用該類型或成員是錯誤的。示例1包含兩個文件(表示兩個文件不在同一個程序集中):Assembly1.cs 和 Assembly2.cs。第一個文件包含內(nèi)部基類BaseClass,在第二個文件中,實例化BaseClass的嘗試將產(chǎn)生錯誤:
示例1:
// Assembly1.cs internal class BaseClass { public static int intM = 0; } // Assembly2.cs // Compile with:Assembly1.dll class TestAccess { static void Main() { BaseClass myBase = new BaseClass(); // 錯誤,無法實例化 } }
在示例2中,使用與示例1中所用相同的文件,并將BaseClass的可訪問性級別更改為public,還將成員IntM的可訪問性級別更改為internal。在此例中,可以實例化類,但不能訪問其內(nèi)部成員:
示例2:
// Assembly1.cs public class BaseClass { internal static int intM = 0; } // Assembly2.cs // Compile with:Assembly1.dll public class TestAccess { static void Main() { BaseClass myBase = new BaseClass(); // Ok,可以實例化類 BaseClass.intM = 444; // 錯誤,因為不能訪問內(nèi)部成員 } }
以上所述是小編給大家介紹的C#中的Internal關鍵字小結,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
WinForm中變Enter鍵為Tab鍵實現(xiàn)焦點轉移的方法
這篇文章主要介紹了WinForm中變Enter鍵為Tab鍵實現(xiàn)焦點轉移的方法,主要通過一個ControlTools類來實現(xiàn)該功能,需要的朋友可以參考下2014-08-08C#用websocket實現(xiàn)簡易聊天功能(客戶端)
這篇文章主要為大家詳細介紹了C#用websocket實現(xiàn)簡易聊天功能,客戶端方向,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02解決WPF附加屬性的Set函數(shù)不調(diào)用的問題
這篇文章介紹了解決WPF附加屬性的Set函數(shù)不調(diào)用的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-06-06C# DataTable數(shù)據(jù)遍歷優(yōu)化詳解
這篇文章主要介紹了C# DataTable數(shù)據(jù)遍歷優(yōu)化詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01