首先,理清幾個(gè)概念:項(xiàng)目(project)、解決方案(solution)、程序集(assembly)、命名空間(namespace)。
項(xiàng)目(project) 就是我們開(kāi)發(fā)的一個(gè)軟件。.NET下,項(xiàng)目有多種類(lèi)型,如控制臺(tái)、Windows應(yīng)用程序、類(lèi)庫(kù)、Web應(yīng)用程序等等。經(jīng)過(guò)編譯后,會(huì)生成.exe文件和.dll文件。 .exe文件有統(tǒng)一的主程序入口,可以被執(zhí)行,而類(lèi)庫(kù)只是提供一些功能給其他項(xiàng)目調(diào)用。
解決方案(solution) 當(dāng)我們?cè)赩S中新建任何一種類(lèi)型的項(xiàng)目時(shí),這個(gè)項(xiàng)目還屬于一個(gè)解決方案。當(dāng)我們的業(yè)務(wù)相對(duì)簡(jiǎn)單時(shí),解決方案所發(fā)揮的作用并不是很大。但當(dāng)我們開(kāi)發(fā)復(fù)雜的軟件時(shí),需要多個(gè)模塊組成。比如說(shuō)開(kāi)發(fā)中常用的三層架構(gòu),U層是一個(gè)簡(jiǎn)單的windows應(yīng)用程序(項(xiàng)目的一種類(lèi)型),B、D層由多個(gè)類(lèi)庫(kù)(項(xiàng)目的另一種類(lèi)型)組成。通過(guò)一個(gè)解決方案,我們就可以將其多個(gè)項(xiàng)目組合起來(lái),完成我們的開(kāi)發(fā)。形象地說(shuō),解決方案就是一個(gè)容器,在這個(gè)容器里,分成好多層,好多格,用來(lái)存放不同的項(xiàng)目。換句話來(lái)說(shuō)就是:程序集就是一個(gè)項(xiàng)目,多個(gè)項(xiàng)目構(gòu)成一個(gè)解決方案。
程序集(assembly) 一個(gè)項(xiàng)目就是一個(gè)程序集。一個(gè)程序集可以體現(xiàn)為一個(gè)dll文件,或者exe文件。
命名空間(namespace) 主要是為了避免一個(gè)項(xiàng)目中,可能會(huì)存在的相同對(duì)象名的沖突。
從編輯上來(lái)說(shuō),命名空間僅僅是在類(lèi)型名稱(chēng)前加了一些由點(diǎn)號(hào)隔開(kāi)的符號(hào)而已,這使得一個(gè)類(lèi)型的名稱(chēng)更長(zhǎng),從而也更具惟一性。如果兩個(gè)相同的類(lèi)在同一個(gè)命名空間則會(huì)沖突,如果不同的命名空間有相同的類(lèi)型,也會(huì)產(chǎn)生二義性。
注意,C#的using指示符會(huì)指示編譯器試著在類(lèi)型名上添加不同的前綴,直到找到一個(gè)匹配為止。命名空間只是邏輯上,真正的類(lèi)型在程序集里。當(dāng)查找一個(gè)類(lèi)型的定義時(shí),編譯器必須被告知到哪些程序集中進(jìn)行查找,編譯器將掃描它知道的所有程序集來(lái)查找類(lèi)型的定義。一旦編譯器找到了正確的程序,程序集信息和類(lèi)型信息會(huì)被添加到生成托管模塊的元數(shù)據(jù)中。
重要提示:CLR不知道命名空間的任何事情。訪問(wèn)一個(gè)類(lèi)型時(shí),CLR需要知道類(lèi)型的完整名稱(chēng)(這可能是一個(gè)相當(dāng)長(zhǎng)、包含句點(diǎn)符號(hào)的名稱(chēng))以及該類(lèi)型的定義具體在哪一個(gè)程序集中。這樣一來(lái),“運(yùn)行時(shí)”才能加載正確的程序集,找到目標(biāo)類(lèi)型,并對(duì)其進(jìn)行操作。
聯(lián)系與區(qū)別:
命名空間是類(lèi)庫(kù)的邏輯組織形式,程序集就是類(lèi)庫(kù)的物理組織形式
一個(gè)程序集內(nèi)可能有多個(gè)命名空間,一個(gè)命名空間可能存在于不同的程序集中
程序集是實(shí)現(xiàn)類(lèi)型的文件,編譯之后生成的。命名空間是對(duì)類(lèi)型的邏輯分組。
C#編譯器可能比較關(guān)心命名空間,因?yàn)樗枰_定類(lèi)的完整名稱(chēng),然后交給CLR。CLR只關(guān)心程序集,會(huì)通過(guò)類(lèi)的完整名稱(chēng)加載對(duì)應(yīng)的程序集
總結(jié):
通過(guò)在項(xiàng)目中使用分部類(lèi),發(fā)現(xiàn)可以通過(guò)分部類(lèi)實(shí)現(xiàn)對(duì)這個(gè)類(lèi)的擴(kuò)充和完善。而使用分部類(lèi)時(shí)我們會(huì)對(duì)命名空間進(jìn)行修改,進(jìn)而將類(lèi)進(jìn)行擴(kuò)展,這就是我們說(shuō)的一個(gè)命名空間可以存在于不同的程序集。通過(guò)項(xiàng)目去不斷成長(zhǎng),努力去做,《關(guān)于分部類(lèi)的介紹可以訪問(wèn)下面地址:https://msdn.microsoft.com/zh-cn/library/wa80x488.aspx 》
1、internal(內(nèi)部):限定的是只有在同一程序集中可訪問(wèn),可以跨類(lèi)
protected(受保護(hù)):限定的是只有在繼承的子類(lèi)中可訪問(wèn),可以跨程序集
protected internal:受保護(hù)“或”內(nèi)部修飾符修飾成員,當(dāng)父類(lèi)與子類(lèi)在同一個(gè)程序集中,internal成員可見(jiàn)。當(dāng)父類(lèi)與子類(lèi)不在同一個(gè)程序集中,子類(lèi)不能訪問(wèn)父類(lèi)internal成員,而子類(lèi)可以訪問(wèn)父類(lèi)的ptotected internal成員,
即,從當(dāng)前程序集或從包含類(lèi)派生的類(lèi)型,可以訪問(wèn)具有訪問(wèn)修飾符protected internal的類(lèi)型或成員。
2、internal關(guān)鍵字是類(lèi)型和類(lèi)型的成員訪問(wèn)修飾符。只有在同一程序集的文件中,內(nèi)部類(lèi)型或成員才是可訪問(wèn)的。內(nèi)部訪問(wèn)通常用于基于組件的開(kāi)發(fā),因?yàn)樗挂唤M組件能夠以私有方式進(jìn)行合作,而不必向應(yīng)用程序代碼的其余部分公開(kāi)。例如,用于生成圖形用戶(hù)界面的框架可以提供Control和Form類(lèi),這兩個(gè)類(lèi)通過(guò)使用具有內(nèi)部訪問(wèn)權(quán)限的成員進(jìn)行合作。由于這些成員是內(nèi)部的,它們不向正在使用框架的代碼公開(kāi)。
3、從定義具有內(nèi)部訪問(wèn)能力的類(lèi)型或成員的程序集外部引用該類(lèi)型或成員是錯(cuò)誤的。示例1包含兩個(gè)文件(表示兩個(gè)文件不在同一個(gè)程序集中):Assembly1.cs 和 Assembly2.cs。第一個(gè)文件包含內(nèi)部基類(lèi)BaseClass,在第二個(gè)文件中,實(shí)例化BaseClass的嘗試將產(chǎn)生錯(cuò)誤:
示例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(); // 錯(cuò)誤,無(wú)法實(shí)例化 } }在示例2中,使用與示例1中所用相同的文件,并將BaseClass的可訪問(wèn)性級(jí)別更改為public,還將成員IntM的可訪問(wèn)性級(jí)別更改為internal。在此例中,可以實(shí)例化類(lèi),但不能訪問(wèn)其內(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,可以實(shí)例化類(lèi) BaseClass.intM = 444; // 錯(cuò)誤,因?yàn)椴荒茉L問(wèn)內(nèi)部成員 } }以上所述是小編給大家介紹的C#中的Internal關(guān)鍵字小結(jié),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)VEVB武林網(wǎng)網(wǎng)站的支持!
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注