類的實例化知多少

其實,做爲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

-------------------------------------------------------------------------------

以上是程序執行結果,看到這裏,你們比照一下本身的答案,答對了嗎?

呵呵,我第一次回答,是沒答對。由此我知道,不少時候,咱們只會用,可是不知道原理細節。

我這麼說並非說作什麼事情都要把細節摸透,這是因地制宜的。

咱們掌握了類的實例化過程,那麼就能夠提升咱們編寫代碼的質量,提升程序的運行性能。

有的時候,知其因此然會更利於咱們寫出高質量的程序。

--------------------------------------------------------------------------------

哈哈很少說廢話了,下面解釋一下上面執行的順序。

首先,子類實例化,若是是第一次實例化,那麼首先實例化靜態成員字段,其次調用靜態構造函數;若是不是第一次實例化,那麼這一步跳過。

其次,子類實例化非靜態成員字段。

再者,父類實例化,若是是第一次實例化,那麼首先實例化父類靜態成員字段,其次調用父類靜態構造函數;若是不是第一次實例化,那麼這一步跳過。

接着,父類實例化非靜態成員字段。

而後,父類調用父類非靜態構造方法。

緊跟着,子類調用子類非靜態構造方法。

---------------------------------------------------------------------------------

以上就是類的實例化過程,有一點你們也許會疑惑,那就是靜態構造函數,與靜態成員變量。

每個類都有一個靜態構造函數, 該靜態構造函數在實例化類的第一個對象的時候被調用,並且只調用一次。

靜態成員變量的實例化是在調用靜態構造函數以前,也是實例化一次。

相關文章
相關標籤/搜索