在.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();
}
}