基於http://msdn.microsoft.com/en-us/library/aa288208%28v=vs.71%29.aspx什麼是「一個結構不能有一個初始化的形式:base(參數列表)」。
結構構造類似於類的構造函數,除了以下區別:
的Structs不能包含明確的 參數構造函數。 Struct 成員會自動將 初始化爲其默認值。
一個結構不能有以下形式的初始化程序 :base(argument-list)。
我有問題,瞭解項目2.有人可以給我一個具體的例子嗎?
基於http://msdn.microsoft.com/en-us/library/aa288208%28v=vs.71%29.aspx什麼是「一個結構不能有一個初始化的形式:base(參數列表)」。
結構構造類似於類的構造函數,除了以下區別:
的Structs不能包含明確的 參數構造函數。 Struct 成員會自動將 初始化爲其默認值。
一個結構不能有以下形式的初始化程序 :base(argument-list)。
我有問題,瞭解項目2.有人可以給我一個具體的例子嗎?
基本上,結構不支持繼承。雖然在技術上他們繼承了基類對象,但第2項指出你不能顯式地調用基類構造函數。 這裏更多的信息:http://msdn.microsoft.com/en-us/library/aa288471%28v=vs.71%29.aspx
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;
}
}
的一點是,一個Derived
是Base
正因爲如此,一個構造函數因爲需要調用Base
以完全初始化Derived
的新實例(即Derived
的部分使其需要初始化爲Base
)。通過語法base(...)
調用基礎構造函數,可以調用適當的構造函數。
您質疑struct
的陳述聲明不允許進行此類調用。這主要是因爲根據這個答案的第一句中陳述的事實,決不會有這樣的構造函數。
下面是一個初始化器的例子,格式如下: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.
}
結構不支持繼承,因此不允許顯式調用基類的構造函數。
確實。但是MSDN選擇了一種非常迂迴的方式來表達這一點。我不確定他們爲什麼覺得這種融合是相關的。 – 2011-06-07 15:30:02
你鏈接到的頁面是垃圾,因爲它說:「當你在一個類上調用'new'運算符時,它將被分配到堆上。但是,當你實例化一個結構體時,它會在堆棧上創建。「 – jason 2011-06-07 15:31:06
@Jason - 爲什麼這個聲明是垃圾?是不是真的? – BornToCode 2014-10-02 12:17:56