C# 訪問修飾符internal的訪問范圍誤區釋疑


  一、前言                                              

MSDN關於訪問修飾符的訪問級別解釋:

訪問修飾符是一些關鍵字,用於指定聲明的成員或類型的可訪問性。本節介紹四個訪問修飾符:

使用這些訪問修飾符可指定下列五個可訪問性級別:

public:訪問不受限制。

protected:訪問僅限於包含類或從包含類派生的類型。

Internal:訪問僅限於當前程序集。

protected internal:訪問限制到當前程序集或從包含派生的類型的類別。

private:訪問僅限於包含類型。

  二、認知誤區                                        

  internal,英文含義是“內部的”,這時候基礎不扎實的同學,可能就混淆了這個“內部的”的確切含義,到底是指“同一命名空間”的內部,還是“同一程序集”的內部,本人就是突然被問到這個問題的時候,真的就猶豫了,而且曾經一度以為就是“同一命名空間”的內部(話外:我們太多時候都自以為了,其實只要自己稍微MSDN查一下,就很清楚了)。

  第一部分已經摘抄了微軟MSDN官方的解釋,其實這個內部就是“同一程序集”的內部,也就是說,internal修飾的方法或者屬性,只要是在同一個程序集的中的其他類都可以訪問,如果二者不在同一命名空間,只要使用using引用上相應的命名空間即可,這里,從另外一個方面也間接看出命名空間並不是界定訪問級別的,而是保證全局的類唯一性的,下面就從現實生活中解釋下internal的實際作用。

  三、釋疑                                              

  都說藝術源於生活,編程也是一門藝術,所以一樣也是可以成生活中找到相應的場景,下面我們以實際生活場景來描述internal修飾符的作用。

  某公司的某技術中心,發文規定即日起,中心內的“打印機”僅限本中心的各個部門使用,其他中心的人員不能使用。這個現實生活的場景中,技術中心其實就是個程序集,而每個部門相當於不同的類,當然部門可以有相應的標簽,相當於不同的命名空間,其實就是進行邏輯划分,職責不同的部門屬於不同的命名空間就可以理解了。而我們的“主角”打印機的旁邊就會被貼上公告“本中心的打印機只能本中心使用。。。。”,此時就相當於給打印機打上了internal修飾符了。其他中心的同學們,再也用不上本中心的打印機了。

  下面我們用代碼來描述上面的場景:

  1.   我們先在一個公共的類庫中(程序集)定義一個打印機的類
    1.  1 namespace CommonAsset
       2 {
       3     public class Printer
       4     {
       5         private bool _isBad;
       6         /// <summary>
       7         /// 打印機是否壞了
       8         /// </summary>
       9         public bool IsBad
      10         {
      11             get { return _isBad; }
      12             set { _isBad = value; }
      13         }
      14 
      15         public void Print()
      16         {
      17             Console.WriteLine("開始打印!");
      18         }
      19     }
      20 }

       

  2. 然后我們在創建一個中心A(程序集),分別定義各個部門,且屬於不同的命名空間
    1.   
       1 namespace CenterA.Administration
       2 {
       3     public class DepartmentB
       4     {
       5         internal Printer PrinterB { get; set; }
       6         public DepartmentB()
       7         {
       8             PrinterB = new Printer();
       9         }
      10     }
      11 }
      12 
      13 
      14 namespace CenterA.Technology
      15 {
      16     public class DepartmentA
      17     {
      18         internal Printer PrinterA { get; set; }
      19         public DepartmentA()
      20         {
      21             PrinterA = new Printer();
      22         }
      23 
      24         public void PrintSomething()
      25         {
      26             if (PrinterA.IsBad)
      27             {
      28                 CenterA.Administration.DepartmentB departmentB = new CenterA.Administration.DepartmentB();
      29                 departmentB.PrinterB.Print();
      30             }
      31             else
      32             {
      33                 PrinterA.Print();
      34             }
      35         }
      36     }
      37 }

       

  3. 上面可以看見,DepartmentB和DepartmentA雖然不在同一個命名空間,但由於同屬於CenterA這個程序集,DepartmentA是可以訪問DepartmentB中的
    Printer 的。

 


免責聲明!

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



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