天天看點

C# internal解析  一、前言                                                二、認知誤區                                          三、釋疑                                              

  一、前言                                              

MSDN關于通路修飾符的通路級别解釋:

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

  • public
  • protected
  • internal
  • private

使用這些通路修飾符可指定下列五個可通路性級别:

public:通路不受限制。

protected:通路僅限于包含類或從包含類派生的類型。

Internal:通路僅限于目前程式集。

protected internal:通路限制到目前程式集或從包含派生的類型的類别。

private:通路僅限于包含類型。

  二、認知誤區                                        

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

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

  三、釋疑                                              

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

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

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

  1.   我們先在一個公共的類庫中(程式集)定義一個列印機的類
    namespace CommonAsset
    {
        public class Printer
        {
            private bool _isBad;
            /// <summary>
            /// 列印機是否壞了
            /// </summary>
            public bool IsBad
            {
                get { return _isBad; }
                set { _isBad = value; }
            }
    
            public void Print()
            {
                Console.WriteLine("開始列印!");
            }
        }
    }
               
  2. 然後我們在建立一個中心A(程式集),分别定義各個部門,且屬于不同的命名空間
    namespace CenterA.Administration
    {
        public class DepartmentB
        {
            internal Printer PrinterB { get; set; }
            public DepartmentB()
            {
                PrinterB = new Printer();
            }
        }
    }
    
    
    namespace CenterA.Technology
    {
        public class DepartmentA
        {
            internal Printer PrinterA { get; set; }
            public DepartmentA()
            {
                PrinterA = new Printer();
            }
    
            public void PrintSomething()
            {
                if (PrinterA.IsBad)
                {
                    CenterA.Administration.DepartmentB departmentB = new CenterA.Administration.DepartmentB();
                    departmentB.PrinterB.Print();
                }
                else
                {
                    PrinterA.Print();
                }
            }
        }
    }
               
  3. 上面可以看見,DepartmentB和DepartmentA雖然不在同一個命名空間,但由于同屬于CenterA這個程式集,DepartmentA是可以通路DepartmentB中的
    Printer 。      
  4. 作者:小偉06

    出處:https://www.cnblogs.com/liuww/p/5335003.html

    本站使用「劉文偉」創作共享協定,轉載請在文章明顯位置注明作者及出處。