2011-06-07 13 views
1

基於http://msdn.microsoft.com/en-us/library/aa288208%28v=vs.71%29.aspx什麼是「一個結構不能有一個初始化的形式:base(參數列表)」。

結構構造類似於類的構造函數,除了以下區別:

  1. 的Structs不能包含明確的 參數構造函數。 Struct 成員會自動將 初始化爲其默認值。

  2. 一個結構不能有以下形式的初始化程序 :base(argument-list)。

我有問題,瞭解項目2.有人可以給我一個具體的例子嗎?

回答

1

基本上,結構不支持繼承。雖然在技術上他們繼承了基類對象,但第2項指出你不能顯式地調用基類構造函數。 這裏更多的信息:http://msdn.microsoft.com/en-us/library/aa288471%28v=vs.71%29.aspx

+2

確實。但是MSDN選擇了一種非常迂迴的方式來表達這一點。我不確定他們爲什麼覺得這種融合是相關的。 – 2011-06-07 15:30:02

+0

你鏈接到的頁面是垃圾,因爲它說:「當你在一個類上調用'new'運算符時,它將被分配到堆上。但是,當你實例化一個結構體時,它會在堆棧上創建。「 – jason 2011-06-07 15:31:06

+0

@Jason - 爲什麼這個聲明是垃圾?是不是真的? – BornToCode 2014-10-02 12:17:56

1

struct(隱含的)從System.ValueType立即獲得並就abstract類唯一的構造是protected和參數的。這些是由語言規範和你都在質疑聲明的事實是這些事實的結果,並在語言規範明確指出,從第11.3.8節:

一個struct實例構造不允許包括構造函數初始化形式爲base(...)

對於從可訪問的非參數構造函數的類派生引用類型,你可以做到以下幾點:

class Base { 
    private readonly string baseName; 
    public string BaseName { get { return this.baseName; } } 
    public Base(string baseName) { this.baseName = baseName; } 
} 

class Derived : Base { 
    private readonly string derivedName; 
    public string DerivedName { get { return this.derivedName; } } 

    public Derived(string baseName, string derivedName) : base(baseName) { 
     this.derivedName = derivedName; 
    } 
} 

的一點是,一個DerivedBase正因爲如此,一個構造函數因爲需要調用Base以完全初始化Derived的新實例(即Derived的部分使其需要初始化爲Base)。通過語法base(...)調用基礎構造函數,可以調用適當的構造函數。

您質疑struct的陳述聲明不允許進行此類調用。這主要是因爲根據這個答案的第一句中陳述的事實,決不會有這樣的構造函數。

0

下面是一個初始化器的例子,格式如下:base(argument-list)。

public class Foo 
{ 
    public Foo(int i) { Debug.WriteLine(i); } 
} 

public class Bar: Foo 
{ 
    public Bar() : base(4) {} // Prints '4' to debug via the base class's constructor. 
} 

結構不支持繼承,因此不允許顯式調用基類的構造函數。

相關問題