2010-05-08 107 views
0

我有一個自定義的結構:
C#奇怪的行爲

struct A 
{ 
    public int y; 
} 

空constuctor自定義類:

class B 
{ 
    public A a; 
    public B() 
    { 
    } 
} 

,這裏是主要的:

static void Main(string[] args) 
{ 
    B b = new B(); 
    b.a.y = 5;//No runtime errors! 
    Console.WriteLine(b.a.y); 
} 


當我運行上述程序時,它不會給我一個ny錯誤,儘管我沒有在B類構造函數中初始化結構體A ..'a = new A();'

+1

我對這個問題感到困惑。爲什麼你會期望一個* runtime *錯誤?我可以看到爲什麼你會期望*編譯時*錯誤,但爲什麼你會期望*運行時*錯誤?我懷疑你認爲運行時錯誤在這裏是適當的,這是對「價值類型」意味着什麼的深刻誤解的症狀。你能解釋爲什麼你認爲這應該是一個運行時,而不是編譯時錯誤?如果字段「a」的類型是「double」而不是struct A,您是否也期望運行時錯誤?爲什麼或者爲什麼不? – 2010-05-08 15:27:05

回答

7

我沒有在B類構造函數中初始化結構A.

C#爲您做到這一點。除非您在其聲明或構造函數中爲其分配其他值,否則類的所有成員都將初始化爲其默認值。

對於class實例,默認值爲null,並且在使用該實例時會出現錯誤。但是,對於struct實例(其中而不是引用與類實例不同),則不存在null值。 struct的默認值是其所有字段都已默認初始化的實例。

這就是您的代碼工作的原因。