c#對象初始化順序?qū)嵗治?/h1>
更新時間:2015年06月09日 16:21:28 作者:McJeremy&Fan
這篇文章主要介紹了c#對象初始化順序,實例分析了C#對象初始化的相關(guān)使用技巧與調(diào)用順序,需要的朋友可以參考下
本文實例分析了c#對象初始化順序。分享給大家供大家參考。具體如下:
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 {
//調(diào)用到這個構(gòu)造函數(shù)時:x=1,y=0
public A() {
//該函數(shù)在B類中被重載,因此輸出 x=1,y=0
Console.WriteLine("在A類的構(gòu)造函數(shù)中");
PrintFields();
}
public virtual void PrintFields() { }
}
class B : A {
//派生類變量/靜態(tài)成員的執(zhí)行順序優(yōu)于基類
//先變量,因此,x=1,y=0
int x = 1;
int y;
//后構(gòu)造函數(shù),此時,先調(diào)用基類構(gòu)造函數(shù)
public B() {
//運行到這里時,A類構(gòu)造函數(shù)已經(jīng)執(zhí)行完畢
y = -1;
Console.WriteLine("在B類的構(gòu)造函數(shù)中");
//此時 x=1,y=-1
PrintFields();
}
public override void PrintFields() {
Console.WriteLine("x={0},y={1}", x, y);
}
}
}
這里備忘一下c#對象初始化順序及C++對象初始化順序:
C#對象初始化
1. 先變量后構(gòu)造函數(shù)。變量先被初始化,然后構(gòu)造函數(shù)被執(zhí)行
2. 先靜態(tài)化后實例化。當一個類被訪問時,靜態(tài)變量和構(gòu)造函數(shù)最先被初始化.接著是對象的實例化變量和構(gòu)造函數(shù)被初始化
3. 先派生類后基類。對于變量和靜態(tài)構(gòu)造函數(shù),派生對象在基對象之前被初始化.比如C類派生自B類,B類派生自A類,那么變量和靜態(tài)構(gòu)造函數(shù)被初始化次序是C-B-A.
4. 除了實例構(gòu)造函數(shù)。對于實例構(gòu)造函數(shù),基類構(gòu)造函數(shù)在派生類構(gòu)造函數(shù)之前執(zhí)行,實例構(gòu)造函數(shù)被執(zhí)行次序是A-B-C.
5. 不要假定變量的次序。Fields依據(jù)它們在源文件中的聲明的順序依次初始化.然而,自從程序員和工具可以隨意安排變量的聲明后,你不應(yīng)該在依靠變量任何特別的次序初始化
6. 對虛方法用兩個階段的構(gòu)建。避免從一個構(gòu)造器調(diào)用虛方法. 如果在初始化一個對象時需要調(diào)用一些虛方法,應(yīng)在完整構(gòu)造該對象的地方使用兩階段的構(gòu)建,并隨后調(diào)用已構(gòu)造對象的初始化方法。
C++構(gòu)造函數(shù)調(diào)用順序
1. 如果類里面有成員類,成員類的構(gòu)造函數(shù)優(yōu)先被調(diào)用;
2. 創(chuàng)建派生類的對象,基類的構(gòu)造函數(shù)優(yōu)先被調(diào)用(也優(yōu)先于派生類里的成員類);
3. 基類構(gòu)造函數(shù)如果有多個基類,則構(gòu)造函數(shù)的調(diào)用順序是某類在類派生表中出現(xiàn)的順序而不是它們在成員初始化表中的順序;
4. 成員類對象構(gòu)造函數(shù)如果有多個成員類對象,則構(gòu)造函數(shù)的調(diào)用順序是對象在類中被聲明的順序而不是它們出現(xiàn)在成員初始化表中的順序;
5. 派生類構(gòu)造函數(shù),作為一般規(guī)則派生類構(gòu)造函數(shù)應(yīng)該不能直接向一個基類數(shù)據(jù)成員賦值而是把值傳遞給適當?shù)幕悩?gòu)造函數(shù),否則兩個類的實現(xiàn)變成緊耦合的(tightly coupled)將更加難于正確地修改或擴展基類的實現(xiàn)。(基類設(shè)計者的責任是提供一組適當?shù)幕悩?gòu)造函數(shù))
希望本文所述對大家的C#程序設(shè)計有所幫助。
相關(guān)文章
-
c#使用微信接口開發(fā)微信門戶應(yīng)用中微信消息的處理和應(yīng)答
這篇文章主要介紹了c#使用微信接口開發(fā)微信門戶中的微信消息的處理和應(yīng)答的過程,需要的朋友可以參考下 2014-03-03
-
基于C#實現(xiàn)ModbusTCP服務(wù)器接口的方法
ModbusTCP服務(wù)器的本質(zhì)就是TCP服務(wù)器,根據(jù)識別ModbusTCP請求報文,返回對應(yīng)的ModbusTCP報文,今天給大家分享一下,如何基于C#來ModbusTCP服務(wù)器接口,需要的朋友可以參考下 2025-01-01
-
C#通過yield實現(xiàn)數(shù)組全排列的方法
這篇文章主要介紹了C#通過yield實現(xiàn)數(shù)組全排列的方法,以實例形式較為詳細的分析了全排列的概念及C#的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下 2015-03-03
-
C#常用多線程(線程同步,事件觸發(fā),信號量,互斥鎖,共享內(nèi)存,消息隊列)
這篇文章主要介紹了C#常用多線程(線程同步,事件觸發(fā),信號量,互斥鎖,共享內(nèi)存,消息隊列),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下 2023-09-09
最新評論
本文實例分析了c#對象初始化順序。分享給大家供大家參考。具體如下:
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 {
//調(diào)用到這個構(gòu)造函數(shù)時:x=1,y=0
public A() {
//該函數(shù)在B類中被重載,因此輸出 x=1,y=0
Console.WriteLine("在A類的構(gòu)造函數(shù)中");
PrintFields();
}
public virtual void PrintFields() { }
}
class B : A {
//派生類變量/靜態(tài)成員的執(zhí)行順序優(yōu)于基類
//先變量,因此,x=1,y=0
int x = 1;
int y;
//后構(gòu)造函數(shù),此時,先調(diào)用基類構(gòu)造函數(shù)
public B() {
//運行到這里時,A類構(gòu)造函數(shù)已經(jīng)執(zhí)行完畢
y = -1;
Console.WriteLine("在B類的構(gòu)造函數(shù)中");
//此時 x=1,y=-1
PrintFields();
}
public override void PrintFields() {
Console.WriteLine("x={0},y={1}", x, y);
}
}
}
這里備忘一下c#對象初始化順序及C++對象初始化順序:
C#對象初始化
1. 先變量后構(gòu)造函數(shù)。變量先被初始化,然后構(gòu)造函數(shù)被執(zhí)行
2. 先靜態(tài)化后實例化。當一個類被訪問時,靜態(tài)變量和構(gòu)造函數(shù)最先被初始化.接著是對象的實例化變量和構(gòu)造函數(shù)被初始化
3. 先派生類后基類。對于變量和靜態(tài)構(gòu)造函數(shù),派生對象在基對象之前被初始化.比如C類派生自B類,B類派生自A類,那么變量和靜態(tài)構(gòu)造函數(shù)被初始化次序是C-B-A.
4. 除了實例構(gòu)造函數(shù)。對于實例構(gòu)造函數(shù),基類構(gòu)造函數(shù)在派生類構(gòu)造函數(shù)之前執(zhí)行,實例構(gòu)造函數(shù)被執(zhí)行次序是A-B-C.
5. 不要假定變量的次序。Fields依據(jù)它們在源文件中的聲明的順序依次初始化.然而,自從程序員和工具可以隨意安排變量的聲明后,你不應(yīng)該在依靠變量任何特別的次序初始化
6. 對虛方法用兩個階段的構(gòu)建。避免從一個構(gòu)造器調(diào)用虛方法. 如果在初始化一個對象時需要調(diào)用一些虛方法,應(yīng)在完整構(gòu)造該對象的地方使用兩階段的構(gòu)建,并隨后調(diào)用已構(gòu)造對象的初始化方法。
C++構(gòu)造函數(shù)調(diào)用順序
1. 如果類里面有成員類,成員類的構(gòu)造函數(shù)優(yōu)先被調(diào)用;
2. 創(chuàng)建派生類的對象,基類的構(gòu)造函數(shù)優(yōu)先被調(diào)用(也優(yōu)先于派生類里的成員類);
3. 基類構(gòu)造函數(shù)如果有多個基類,則構(gòu)造函數(shù)的調(diào)用順序是某類在類派生表中出現(xiàn)的順序而不是它們在成員初始化表中的順序;
4. 成員類對象構(gòu)造函數(shù)如果有多個成員類對象,則構(gòu)造函數(shù)的調(diào)用順序是對象在類中被聲明的順序而不是它們出現(xiàn)在成員初始化表中的順序;
5. 派生類構(gòu)造函數(shù),作為一般規(guī)則派生類構(gòu)造函數(shù)應(yīng)該不能直接向一個基類數(shù)據(jù)成員賦值而是把值傳遞給適當?shù)幕悩?gòu)造函數(shù),否則兩個類的實現(xiàn)變成緊耦合的(tightly coupled)將更加難于正確地修改或擴展基類的實現(xiàn)。(基類設(shè)計者的責任是提供一組適當?shù)幕悩?gòu)造函數(shù))
希望本文所述對大家的C#程序設(shè)計有所幫助。
相關(guān)文章
c#使用微信接口開發(fā)微信門戶應(yīng)用中微信消息的處理和應(yīng)答
這篇文章主要介紹了c#使用微信接口開發(fā)微信門戶中的微信消息的處理和應(yīng)答的過程,需要的朋友可以參考下2014-03-03
基于C#實現(xiàn)ModbusTCP服務(wù)器接口的方法
ModbusTCP服務(wù)器的本質(zhì)就是TCP服務(wù)器,根據(jù)識別ModbusTCP請求報文,返回對應(yīng)的ModbusTCP報文,今天給大家分享一下,如何基于C#來ModbusTCP服務(wù)器接口,需要的朋友可以參考下2025-01-01
C#通過yield實現(xiàn)數(shù)組全排列的方法
這篇文章主要介紹了C#通過yield實現(xiàn)數(shù)組全排列的方法,以實例形式較為詳細的分析了全排列的概念及C#的實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下2015-03-03
C#常用多線程(線程同步,事件觸發(fā),信號量,互斥鎖,共享內(nèi)存,消息隊列)
這篇文章主要介紹了C#常用多線程(線程同步,事件觸發(fā),信號量,互斥鎖,共享內(nèi)存,消息隊列),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-09-09

