一、前言
MSDN關於訪問修飾符的訪問級別解釋:
訪問修飾符是一些關鍵字,用於指定聲明的成員或類型的可訪問性。本節介紹四個訪問修飾符:
使用這些訪問修飾符可指定下列五個可訪問性級別:
public:訪問不受限制。
protected:訪問僅限於包含類或從包含類派生的類型。
Internal:訪問僅限於當前程序集。
protected internal:訪問限制到當前程序集或從包含派生的類型的類別。
private:訪問僅限於包含類型。
二、認知誤區
internal,英文含義是“內部的”,這時候基礎不扎實的同學,可能就混淆了這個“內部的”的確切含義,到底是指“同一命名空間”的內部,還是“同一程序集”的內部,本人就是突然被問到這個問題的時候,真的就猶豫了,而且曾經一度以為就是“同一命名空間”的內部(話外:我們太多時候都自以為了,其實只要自己稍微MSDN查一下,就很清楚了)。
第一部分已經摘抄了微軟MSDN官方的解釋,其實這個內部就是“同一程序集”的內部,也就是說,internal修飾的方法或者屬性,只要是在同一個程序集的中的其他類都可以訪問,如果二者不在同一命名空間,只要使用using引用上相應的命名空間即可,這里,從另外一個方面也間接看出命名空間並不是界定訪問級別的,而是保證全局的類唯一性的,下面就從現實生活中解釋下internal的實際作用。
三、釋疑
都說藝術源於生活,編程也是一門藝術,所以一樣也是可以成生活中找到相應的場景,下面我們以實際生活場景來描述internal修飾符的作用。
某公司的某技術中心,發文規定即日起,中心內的“打印機”僅限本中心的各個部門使用,其他中心的人員不能使用。這個現實生活的場景中,技術中心其實就是個程序集,而每個部門相當於不同的類,當然部門可以有相應的標簽,相當於不同的命名空間,其實就是進行邏輯划分,職責不同的部門屬於不同的命名空間就可以理解了。而我們的“主角”打印機的旁邊就會被貼上公告“本中心的打印機只能本中心使用。。。。”,此時就相當於給打印機打上了internal修飾符了。其他中心的同學們,再也用不上本中心的打印機了。
下面我們用代碼來描述上面的場景:
- 我們先在一個公共的類庫中(程序集)定義一個打印機的類
-
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 }
-
- 然后我們在創建一個中心A(程序集),分別定義各個部門,且屬於不同的命名空間
-
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 }
-
- 上面可以看見,DepartmentB和DepartmentA雖然不在同一個命名空間,但由於同屬於CenterA這個程序集,DepartmentA是可以訪問DepartmentB中的
Printer 的。