天天看點

C#關鍵字之internal詳解

一、internal

我們都知道的三種類型/成員修飾符public、protected、private,也明白它們所表示的含義,internal也是一各類型/成員修飾符(被修飾的類型或者成員稱為内部類型或成員),隻是它所修飾的類隻能在同一個程式集中被通路,而同一個程式集表示同一個dll程式集或同一個exe程式集。在vs中一個項目會生成一個dll檔案,是以這個dll或這個項目也就是一個程式集。

比如有一個程式集有:

namespace Common
{
    internal class A
    {
        public void aa()
        {
        }
    }
    public class B
    {
        public void bb()
        {
            //這樣是正确的
            A a = new A();
            a.aa();
        }
    }
} 
           

如果另一個項目TestWeb引用了此dll,即common.dll,即

using Common;
namespace TestWeb
{
    public class Test
    {
        public void test_1()
        {
            //這樣是出錯的
            A a = new A();
            a.aa();

            //這樣是正确的
            B b = new B();
            b.bb();
        }
    }
}
           

内部通路通常用于基于元件的開發,因為它使一組元件能夠以私有方式進行合作,而不必向應用程式代碼的其餘部分公開。 例如,用于生成圖形使用者界面的架構可以提供 Control 和 Form 類,這兩個類通過使用具有内部通路權限的成員進行合作。 由于這些成員是内部的,它們不向正在使用架構的代碼公開。

二、protected internal

一般一個成員或類型隻能有一個通路修飾符,但使用protected internal組合時除外,它的通路僅限于從包含類派生的目前程式集或類型。即我們可以在本程式集中通路,也可以在其他程式集中繼承通路。

如下:

namespace Common
{
    protected internal class C
    {
        public void cc()
        {
        }
    }
} 

namespace TestWeb
{
    public class TestA
    {
        public void test_1()
        {
            //這樣是出錯的
            Common.C c = new Common.C();
            c.cc();
        }
    }
    public class TestB : Common.C
    {
        public void test_2()
        {
            //這樣是正确的
            C c = new C();
            c.cc();
        }
    }
}
           

另外附上程式集的特性:

1.程式集是任何 .NET Framework 應用程式的基本構造塊。例如,在生成簡單的 C# 應用程式時,Visual Studio 建立一個單個可移植可執行 (PE) 檔案形式的程式集,明确地說就是一個 EXE 或 DLL。

2.包含描述它們自己的内部版本号和它們包含的所有資料和對象類型的詳細資訊的中繼資料。

3.僅在需要時才加載。如果不使用程式集,則不會加載。這意味着程式集可能是在大型項目中管理資源的有效途徑。

4.可以包含一個或多個子產品。例如,計劃較大的項目時,可以讓幾個各個開發人員負責單獨的子產品,并通過組合所有這些子產品來建立單個程式集。