其實,做爲C#程序員,咱們看到這樣的題目,也許沒什麼感受,由於咱們天天都在對C#對象實例化,可是,咱們真的知道實例化的過程嗎?程序員
也許,咱們老是習慣於寫這樣的語句 A a=new A();,但是,咱們真的知道這樣一句話究竟是怎麼樣執行的嗎?ide
我想,大多數程序員並不清楚。那麼今天,咱們經過一個例子來探究一下類的實例化過程。函數
public class ConsoleTest
{
public ConsoleTest(string content)
{
Console.WriteLine(content);
}
}
public class BaseOne
{
static ConsoleTest a2 = new ConsoleTest("a2");
ConsoleTest a3 = new ConsoleTest("a3");
static BaseOne()
{
ConsoleTest a1 = new ConsoleTest("a1");
}
public BaseOne()
{
ConsoleTest a4 = new ConsoleTest("a4");
}
public virtual void MyFunction()
{
ConsoleTest a5 = new ConsoleTest("a5");
}
public virtual void MyFunction2()
{
ConsoleTest a6=new ConsoleTest("a6");
}
}
public class BaseTwo : BaseOne
{
static ConsoleTest BaseTwo2 = new ConsoleTest("b2");
ConsoleTest BaseTwo3 = new ConsoleTest("b3");
static BaseTwo()
{
ConsoleTest b1 = new ConsoleTest("b1");
}
public BaseTwo()
{
ConsoleTest b4 = new ConsoleTest("b4");
}
public override void MyFunction()
{
ConsoleTest b5 = new ConsoleTest("b5");
}
public new void MyFunction2()
{
ConsoleTest b6 = new ConsoleTest("b6");
}
}
class Program
{
static void Main(string[] args)
{
BaseTwo b = new BaseTwo();
b.MyFunction();
b.MyFunction2();
BaseOne a = new BaseTwo();
a.MyFunction();
a.MyFunction2();
Console.ReadKey();
}
}
執行結果是什麼?性能
這段代碼順便考察了一下 new 與override 關鍵字的區別。spa
執行結果以下:code
b2對象
b1blog
b3string
a2it
a1
a3
a4
b4
b5
b6
b3
a3
a4
b4
b5
a6
-------------------------------------------------------------------------------
以上是程序執行結果,看到這裏,你們比照一下本身的答案,答對了嗎?
呵呵,我第一次回答,是沒答對。由此我知道,不少時候,咱們只會用,可是不知道原理細節。
我這麼說並非說作什麼事情都要把細節摸透,這是因地制宜的。
咱們掌握了類的實例化過程,那麼就能夠提升咱們編寫代碼的質量,提升程序的運行性能。
有的時候,知其因此然會更利於咱們寫出高質量的程序。
--------------------------------------------------------------------------------
哈哈很少說廢話了,下面解釋一下上面執行的順序。
首先,子類實例化,若是是第一次實例化,那麼首先實例化靜態成員字段,其次調用靜態構造函數;若是不是第一次實例化,那麼這一步跳過。
其次,子類實例化非靜態成員字段。
再者,父類實例化,若是是第一次實例化,那麼首先實例化父類靜態成員字段,其次調用父類靜態構造函數;若是不是第一次實例化,那麼這一步跳過。
接着,父類實例化非靜態成員字段。
而後,父類調用父類非靜態構造方法。
緊跟着,子類調用子類非靜態構造方法。
---------------------------------------------------------------------------------
以上就是類的實例化過程,有一點你們也許會疑惑,那就是靜態構造函數,與靜態成員變量。
每個類都有一個靜態構造函數, 該靜態構造函數在實例化類的第一個對象的時候被調用,並且只調用一次。
靜態成員變量的實例化是在調用靜態構造函數以前,也是實例化一次。