C#中Internal關鍵字的總結


注意:想要徹底把Internal關鍵字搞清楚,就耐着性子把她讀完。當然了這篇文章只是對其他文章的總結。也算是引用吧。主要還是為了把知識點搞清楚

進入主題之前先來了解一下,項目、解決方案、程序集、命名空間四個容易混淆的概念。
①項目:就是我們開發的一個軟件。.NET下,項目有多種類型,如控制台、Windows應用程序、類庫、Web應用程序等等。經過編譯后,會生成.exe文件和.dll文件。

.exe文件有統一的主程序入口, 可以被執行,而類庫只是提供一些功能給其他項目調用。
②解決方案:當我們在VS中新建任何一種類型項目時,這個項目還屬於一個解決方案。當我們的業務相對簡單時,解決方案所發揮的作用並不是很大。但當我們開發復

雜的軟件時,需要多個模塊組成。 比如說開發中常用的三層架構,U層是一個簡單的windows應用程序(項目的一種類型)、B、D層由多個類庫(項目的另一種類型)組成。通過一個解決方案,我們就可

以將其(多個項目)組合起來,完成我們的開發。 形象地說,解決方案就是一個容器,在這個容器里,分成好多層,好多格,用來存放不同的項目。換句話來說:就是《程序集就是一個項目,多個項目構成一個解決方案》
③程序集:一個項目就是一個程序集。一個程序集可以體現為一個dll文件,或者exe文件。
④命名空間:主要是為了避免一個項目中,可能會存在的相同對象名的沖突。
對於編輯來說,命名空間僅僅是在類型名稱前加了一些由點號隔開的符號而已.這使得一個類型的名稱更長,從而也更具惟一性.如果兩個相同的類在同一個命名空間則會沖

突,如果不同的命名空間有相同的類型,也會產生二義性。 注意,C#的using指示符會指示編譯器試着在類型名上添加不同的前綴,直到找到一個匹配為止,命名空間只是邏輯上,真正的類型在程序集里,當查找一個類型的定義時,編

譯器必須被告知到哪些程序集中進行查找,編譯器將掃描它知道的所有程序集來查找類型的定義.一旦編譯器找到了正確的程序,程序集信息和類型信息會被添加到生成托管

模塊的元數據中。重要提示:CLR不知道命名空間的任何事情。訪問一個類型時,CLR需要知道類型的完整名稱(這可能是一個相當長、包含句點符號的名稱)以及該類

型的定義具體在哪一個程序集中。這樣一樣,“運行時”才能加載正確的程序集,找到目標類型,並對其進行操作。 二、聯系與區別 1、命名空間是類庫的邏輯組織形式,程序集就是類庫的物理組織形式。 2、一個程序集內可能有多個命名空間,一個命名空間可能存在於不同的程序集中 3、程序集是實現類型的文件,編譯之后生成的。 
命名空間是對類型的邏輯分組。 
4、c#編譯器可能比較關心命名空間,應為它需要確定類的完整名稱,然后交給CLR。 
CLR只關心程序集,會通過類的完整名稱加載對應的程序集。 三、總結
通過在項目中使用分部類,發現可以通過分部類實現對這個類的擴充和完善。而使用分部類時我們會對命名空間進行修改,近而將類進行擴展;這就是我們說的一個

命名空間可以存在於不同的程序集。
通過項目去不斷成長,努力去做,《關於分部類的介紹可以訪問下面地址:https://msdn.microsoft.com/zh-cn/library/wa80x488.aspx 》
1. internal(內部):限定的是只有在同一程序集中可訪問,可以跨類     protected(受保護):限定的是只有在繼承的子類中可訪問,可以跨程序集     protected internal:受保護“或”內部修飾符修飾成員,當父類與子類在同一個程序集中,internal成員可見。當父類與子類不在同一個程序集中,子類不能訪問父類internal成員,

而子類可以訪問父類的ptotected internal成員,
即從當前程序集或從包含類派生的類型,可以訪問具有訪問修飾符 protected internal 的類型或成員。 2. internal 關鍵字是類型和類型的成員 訪問修飾符。只有在同一程序集的文件中,內部類型或成員才是可訪問的
內部訪問通常用於基於組件的開發,因為它使一組組件能夠以私有方式進行合作,而不必向應用程序代碼的其余部分公開。
例如,用於生成圖形用戶界面的框架可以提供 Control 和 Form 類,這兩個類通過使用具有內部訪問權限的成員進行合作。
由於這些成員是內部的,它們不向正在使用框架的代碼公開。
3. 從定義具有內部訪問能力的類型或成員的程序集外部引用該類型或成員是錯誤的。
此示例包含兩個文件(表示兩個文件不在同一個程序集中):Assembly1.cs 和 Assembly1_a.cs。第一個文件包含內部基類 BaseClass。在第二個文件中,實例化

BaseClass 的嘗試將產生錯誤。

// Assembly1.cs

// Compile with: /target:library

internal class BaseClass 

{

   public static int intM = 0;

}

// Assembly1_a.cs

// Compile with: /reference:Assembly1.dll

class TestAccess 

{

   static void Main() 

   {

      BaseClass myBase = new BaseClass();   // 錯誤,沒法實例化

   }

}

 

在此示例中,使用與示例 1 中所用的文件相同的文件,並將 BaseClass 的可訪問性級別更改為 public。還將成員 IntM 的可訪問性級別更改為 internal。在此例中,你可以

實例化類,但不能訪問內部成員。

// Assembly2.cs

// Compile with: /target:library

public class BaseClass 

{

   internal static int intM = 0;

}

// Assembly2_a.cs

// Compile with: /reference:Assembly1.dll

public class TestAccess 

{

   static void Main() 

   {

      BaseClass myBase = new BaseClass();   // Ok.可以實例化類

      BaseClass.intM = 444;    // 產生錯誤,因為不能訪問內部成員

   }

}

 

 

引用:http://blog.csdn.net/baidu_32134295/article/details/51285603


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM