2010-06-13 63 views
2

1)爲什麼必須在編譯時確定字段成員的初始化值?爲什麼必須在編譯時確定字段成員的初始化值?

2)但是,如果初始化值需要在編譯時被確定,那麼爲什麼我只能用一個參考對象初始化A.b場:

class A 
{ 
    B b = new B(); 
} 

class B {} 

謝謝

+0

我不確定你的意思。我剛剛用DateTime.Now初始化一個類成員,它工作正常,甚至認爲DateTime.Now不能在編譯時計算。 – apoorv020 2010-06-13 19:42:50

回答

1

我有點困惑;田地沒有這樣的規則。特別是,無論如何,都會明確初始化字段 - 無論是通過您的代碼,還是通過類型的默認值。唯一的角落案例是explit結構體域初始化,其中必須在結構被認爲完成之前分配所有的域。

不知您是否在談論變量的「明確賦值」方法;即

void Foo() { 
    int i; 
    Console.WriteLine(i); // not valid; i not assigned 
    i = 1; 
    Console.WriteLine(i); // would be value 
} 

這使得對於方法變量來說,這些值永遠不會受到從棧中拾取的隨機值的影響。實際上,有一個IL標記,表示當地人被擦除 - 而IIRC C#編譯器包含這個標記無論如何 ...但語言規範說方法變量必須必須明確分配。


在你例子中,那場初始化本質成爲共同構造函數代碼的一部分。但你永遠不會注意到它。

+0

「在你舉例的情況下,該字段初始化本質上成爲公共構造函數代碼的一部分。」你是否暗示構造函數初始化A.b域? – flockofcode 2010-06-13 19:35:36

+1

@flock:是的,這就是他的意思。賦值語句實際上被移入構造函數中。用Ildasm.exe輕鬆查看 – 2010-06-13 20:03:58

+0

謝謝大家的幫助 – flockofcode 2010-06-13 20:10:34

1

1)爲什麼必須在編譯時確定字段成員的初始化值?

它不能。爲什麼你這麼想 ?

+0

你爲什麼這麼想?如果你有一個字段初始化程序'int i = 7;',它可以在編譯時確定,編譯器會給出一個錯誤,說它在編譯時不能確定嗎? – 2010-06-13 19:34:11

+0

從書籍Illustrated C#2008:「字段初始化值必須在編譯時可確定」 – flockofcode 2010-06-13 19:34:46

+0

我並不完全確定,但似乎不是投了票,我不小心投了你票。我很抱歉,如果是這種情況 – flockofcode 2010-06-13 19:40:39

1

如果您是指Illustrated C# 2008這本書的這一部分,那麼它在該部分討論const字段。編譯器可以用const字段的值替換const字段的使用,所以字段的初始值必須是常量。

原始帖子中的字段不是常量。因此限制不適用於此。

+0

「如果您是指Illustrated C#2008這一部分的內容,那麼它在關於const字段的部分中說:」不,您正在討論的是第71頁以上。我的報價取自第50頁,名稱爲Explicit and Implicit field initialization – flockofcode 2010-06-13 20:09:59

+1

@flockofcode然後它是錯誤的。在http://apress.com/book/errata/778提交更正 – 2010-06-14 15:00:25

相關問題