在.net內部存在一些默認機制,具體說來有如下:
(1)如果類的實例字段沒有賦初始值,那麼它們就會被賦默認值,對於引用類 型字段的默認值為null,對於簡單值類型字段(即數值類型)默認值為對應形式 的0(如sbyte、byte、short、ushort、int、uint、long 和 ulong都是0,而char 類型字段的默認值值是’\0x0000’,float類型字段是0.0f,double類型字段是 0.0d等等)。
(2)如果類中賦初值的靜態字段,那麼自動生成一個靜態構造函數,在靜態函 數中完成賦初值。
(3)如果一個類沒有明確指明派生自哪個類,默認會派生自Object類。
(4)如果一個類沒有定義任何構造函數,默認會給該類生成一個構造函數。
(5)在調用子類的非靜態構造函數的時候,默認會調用父類的構造函數。例如A 繼承B,B繼承C,C沒有明確指明繼承哪個類(實際上是繼承Object),那麼在實 例化A的時候,會首先調用B的構造函數,在調用的構造函數的時候又會調用C的構 造函數,在調用C的構造函數的時候又會去調用Object的構造函數,因此實例化一 個A對象時,在內部會經歷一連串的構造函數調用,就上面的繼承層次來說,構造 函數的調用順序從先到後依次為:object->C->B->A。
下面這部分代碼可以演示這個演示這個過程:
view plaincopy to clipboardprint? using System; public class C { public C() { Console.WriteLine("C"); } } public class B:C { public B() { Console.WriteLine("B"); } } public class A:B { public A() { Console.WriteLine("A"); } } public class Demo:A { static int d=5; public Demo() { } public static void Main() { Demo d = new Demo(); Console.ReadLine(); } } using System; public class C { public C() { Console.WriteLine("C"); } } public class B:C { public B() { Console.WriteLine("B"); } } public class A:B { public A() { Console.WriteLine("A"); } } public class Demo:A { static int d=5; public Demo() { } public static void Main() { Demo d = new Demo(); Console.ReadLine(); } }