簡體   English   中英

什么是默認構造函數訪問修飾符?

[英]what is the default constructor access modifer?

我對默認構造函數訪問修飾符是什么感到困惑,這個MSDN狀態說明是什么

 If the direct base class does not have an accessible parameterless instance constructor, a compile-time error occurs.

因為當我用測試程序應用它時,它失敗了。 我可以創建一個繼承另一個類的對象或類,但是沒有定義外部無參數構造函數。

class A 
{
}
class B : A
{
}
class C
{

    public void main()
    {

        B objB = new B();// as per MSDN here should be the compile time error.

    }
}

[ 來源 ]

如果直接基類沒有可訪問的無參數實例構造函數,則會發生編譯時錯誤。

如果沒有為類定義構造函數,編譯器將自動生成公共默認構造函數。

如果類不包含實例構造函數聲明, 則會自動提供默認實例構造函數 該默認構造函數只是調用直接基類的無參數構造函數。 如果直接基類沒有可訪問的無參數實例構造函數,則會發生編譯時錯誤。 如果類是抽象的,那么默認構造函數的聲明可訪問性將受到保護。 否則,默認構造函數的聲明可訪問性是公共的。

在您的示例中,所有類A,B,C都是使用默認的內部無參數構造函數創建的。

由於兩個類在同一個程序集中,並且內部具有內部構造函數,因此默認情況下不會出現編譯錯誤。 但是如果在類B中聲明一個不可訪問的構造函數(例如private或protected),您將在示例中遇到編譯錯誤。

如果您不自己創建一個無參數構造函數,編譯器會創建無參數構造函數,因此根據MSDN頁面,您的示例實際上最終看起來像這樣;

class A
{
    public A(): base() {}
}

class B : A
{
    public B(): base() {}
}

你對new B()調用最終會調用A的構造函數。 但是,如果您為A創建了一個私有的顯式構造函數;

class A
{
   private A() {}
}

class B : A
{

}

然后這轉化為;

class A
{
   private A() {}
}

class B : A
{
    public B(): base() {}
}

如果A的構造函數無法訪問,那將無法編譯。

如果沒有為類定義構造函數,編譯器將自動生成public默認構造函數。

但是,如果定義了一個限制訪問的構造函數,那么編譯器將拋出。

例如,這應該拋出異常:

class A
{
   private A() {}
}
class B : A
{
}

使用構造函數

Unless the class is static, classes without constructors are 
given a public default constructor by the C# compiler in order to 
enable class instantiation.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM