程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> c#對象初始化順序實例

c#對象初始化順序實例

編輯:更多關於編程

       本文實例分析了c#對象初始化順序。分享給大家供大家參考。具體如下:

      ?

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { A a = new B(); Console.ReadLine(); } } class A { //調用到這個構造函數時:x=1,y=0 public A() { //該函數在B類中被重載,因此輸出 x=1,y=0 Console.WriteLine("在A類的構造函數中"); PrintFields(); } public virtual void PrintFields() { } } class B : A { //派生類變量/靜態成員的執行順序優於基類 //先變量,因此,x=1,y=0 int x = 1; int y; //後構造函數,此時,先調用基類構造函數 public B() { //運行到這裡時,A類構造函數已經執行完畢 y = -1; Console.WriteLine("在B類的構造函數中"); //此時 x=1,y=-1 PrintFields(); } public override void PrintFields() { Console.WriteLine("x={0},y={1}", x, y); } } }

      這裡備忘一下c#對象初始化順序及C++對象初始化順序:

      C#對象初始化

      1. 先變量後構造函數。變量先被初始化,然後構造函數被執行

      2. 先靜態化後實例化。當一個類被訪問時,靜態變量和構造函數最先被初始化.接著是對象的實例化變量和構造函數被初始化

      3. 先派生類後基類。對於變量和靜態構造函數,派生對象在基對象之前被初始化.比如C類派生自B類,B類派生自A類,那麼變量和靜態構造函數被初始化次序是C-B-A.

      4. 除了實例構造函數。對於實例構造函數,基類構造函數在派生類構造函數之前執行,實例構造函數被執行次序是A-B-C.

      5. 不要假定變量的次序。Fields依據它們在源文件中的聲明的順序依次初始化.然而,自從程序員和工具可以隨意安排變量的聲明後,你不應該在依靠變量任何特別的次序初始化

      6. 對虛方法用兩個階段的構建。避免從一個構造器調用虛方法. 如果在初始化一個對象時需要調用一些虛方法,應在完整構造該對象的地方使用兩階段的構建,並隨後調用已構造對象的初始化方法。

      C++構造函數調用順序

      1. 如果類裡面有成員類,成員類的構造函數優先被調用;

      2. 創建派生類的對象,基類的構造函數優先被調用(也優先於派生類裡的成員類);

      3. 基類構造函數如果有多個基類,則構造函數的調用順序是某類在類派生表中出現的順序而不是它們在成員初始化表中的順序;

      4. 成員類對象構造函數如果有多個成員類對象,則構造函數的調用順序是對象在類中被聲明的順序而不是它們出現在成員初始化表中的順序;

      5. 派生類構造函數,作為一般規則派生類構造函數應該不能直接向一個基類數據成員賦值而是把值傳遞給適當的基類構造函數,否則兩個類的實現變成緊耦合的(tightly coupled)將更加難於正確地修改或擴展基類的實現。(基類設計者的責任是提供一組適當的基類構造函數)

      希望本文所述對大家的C#程序設計有所幫助。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved