c#對(duì)象初始化順序?qū)嵗治?/h1>
更新時(shí)間:2015年06月09日 16:21:28 作者:McJeremy&Fan
這篇文章主要介紹了c#對(duì)象初始化順序,實(shí)例分析了C#對(duì)象初始化的相關(guān)使用技巧與調(diào)用順序,需要的朋友可以參考下
本文實(shí)例分析了c#對(duì)象初始化順序。分享給大家供大家參考。具體如下:
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è)構(gòu)造函數(shù)時(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ù),此時(shí),先調(diào)用基類構(gòu)造函數(shù)
public B() {
//運(yùn)行到這里時(shí),A類構(gòu)造函數(shù)已經(jīng)執(zhí)行完畢
y = -1;
Console.WriteLine("在B類的構(gòu)造函數(shù)中");
//此時(shí) x=1,y=-1
PrintFields();
}
public override void PrintFields() {
Console.WriteLine("x={0},y={1}", x, y);
}
}
}
這里備忘一下c#對(duì)象初始化順序及C++對(duì)象初始化順序:
C#對(duì)象初始化
1. 先變量后構(gòu)造函數(shù)。變量先被初始化,然后構(gòu)造函數(shù)被執(zhí)行
2. 先靜態(tài)化后實(shí)例化。當(dāng)一個(gè)類被訪問(wèn)時(shí),靜態(tài)變量和構(gòu)造函數(shù)最先被初始化.接著是對(duì)象的實(shí)例化變量和構(gòu)造函數(shù)被初始化
3. 先派生類后基類。對(duì)于變量和靜態(tài)構(gòu)造函數(shù),派生對(duì)象在基對(duì)象之前被初始化.比如C類派生自B類,B類派生自A類,那么變量和靜態(tài)構(gòu)造函數(shù)被初始化次序是C-B-A.
4. 除了實(shí)例構(gòu)造函數(shù)。對(duì)于實(shí)例構(gòu)造函數(shù),基類構(gòu)造函數(shù)在派生類構(gòu)造函數(shù)之前執(zhí)行,實(shí)例構(gòu)造函數(shù)被執(zhí)行次序是A-B-C.
5. 不要假定變量的次序。Fields依據(jù)它們?cè)谠次募械穆暶鞯捻樞蛞来纬跏蓟?然而,自從程序員和工具可以隨意安排變量的聲明后,你不應(yīng)該在依靠變量任何特別的次序初始化
6. 對(duì)虛方法用兩個(gè)階段的構(gòu)建。避免從一個(gè)構(gòu)造器調(diào)用虛方法. 如果在初始化一個(gè)對(duì)象時(shí)需要調(diào)用一些虛方法,應(yīng)在完整構(gòu)造該對(duì)象的地方使用兩階段的構(gòu)建,并隨后調(diào)用已構(gòu)造對(duì)象的初始化方法。
C++構(gòu)造函數(shù)調(diào)用順序
1. 如果類里面有成員類,成員類的構(gòu)造函數(shù)優(yōu)先被調(diào)用;
2. 創(chuàng)建派生類的對(duì)象,基類的構(gòu)造函數(shù)優(yōu)先被調(diào)用(也優(yōu)先于派生類里的成員類);
3. 基類構(gòu)造函數(shù)如果有多個(gè)基類,則構(gòu)造函數(shù)的調(diào)用順序是某類在類派生表中出現(xiàn)的順序而不是它們?cè)诔蓡T初始化表中的順序;
4. 成員類對(duì)象構(gòu)造函數(shù)如果有多個(gè)成員類對(duì)象,則構(gòu)造函數(shù)的調(diào)用順序是對(duì)象在類中被聲明的順序而不是它們出現(xiàn)在成員初始化表中的順序;
5. 派生類構(gòu)造函數(shù),作為一般規(guī)則派生類構(gòu)造函數(shù)應(yīng)該不能直接向一個(gè)基類數(shù)據(jù)成員賦值而是把值傳遞給適當(dāng)?shù)幕悩?gòu)造函數(shù),否則兩個(gè)類的實(shí)現(xiàn)變成緊耦合的(tightly coupled)將更加難于正確地修改或擴(kuò)展基類的實(shí)現(xiàn)。(基類設(shè)計(jì)者的責(zé)任是提供一組適當(dāng)?shù)幕悩?gòu)造函數(shù))
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
您可能感興趣的文章:- C#類中方法的執(zhí)行順序是什么
- C#類繼承中構(gòu)造函數(shù)的執(zhí)行序列示例詳解
- C#類的多態(tài)性詳解
- C#類中static變量用法分析
- C#類的訪問(wèn)修飾符用法分析
- c#類的使用示例
- C#類中的屬性使用總結(jié)(詳解類的屬性)
- C#類中屬性與成員變量的使用小結(jié)
- C#對(duì)象為Null模式(Null Object Pattern)實(shí)例教程
- c#對(duì)象反序列化與對(duì)象序列化示例詳解
- C#對(duì)象與XMl文件之間的相互轉(zhuǎn)換
- 自定義實(shí)現(xiàn)Json字符串向C#對(duì)象轉(zhuǎn)變的方法
- 關(guān)于C# 類和對(duì)象詳情
相關(guān)文章
-
C#?微信支付回調(diào)驗(yàn)簽處理的實(shí)現(xiàn)
在微信支付中,當(dāng)用戶支付成功后,微信會(huì)把相關(guān)支付結(jié)果和用戶信息發(fā)送給商戶,本文就詳細(xì)的介紹了C#?微信支付回調(diào)驗(yàn)簽處理,具有一定的參考價(jià)值,感興趣的可以了解一下 2021-12-12
-
C#調(diào)用OpenCV開(kāi)發(fā)簡(jiǎn)易版美圖工具【推薦】
本文主要介紹在WPF項(xiàng)目中使用OpenCVSharp3-AnyCPU開(kāi)源類庫(kù)處理圖片,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧 2019-10-10
-
C# 整數(shù)轉(zhuǎn)二進(jìn)制字符串方式
這篇文章主要介紹了C# 整數(shù)轉(zhuǎn)二進(jìn)制字符串方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教 2023-02-02
-
Unity實(shí)現(xiàn)卡牌翻動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)卡牌翻動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下 2019-02-02
最新評(píng)論
本文實(shí)例分析了c#對(duì)象初始化順序。分享給大家供大家參考。具體如下:
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è)構(gòu)造函數(shù)時(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ù),此時(shí),先調(diào)用基類構(gòu)造函數(shù) public B() { //運(yùn)行到這里時(shí),A類構(gòu)造函數(shù)已經(jīng)執(zhí)行完畢 y = -1; Console.WriteLine("在B類的構(gòu)造函數(shù)中"); //此時(shí) x=1,y=-1 PrintFields(); } public override void PrintFields() { Console.WriteLine("x={0},y={1}", x, y); } } }
這里備忘一下c#對(duì)象初始化順序及C++對(duì)象初始化順序:
C#對(duì)象初始化
1. 先變量后構(gòu)造函數(shù)。變量先被初始化,然后構(gòu)造函數(shù)被執(zhí)行
2. 先靜態(tài)化后實(shí)例化。當(dāng)一個(gè)類被訪問(wèn)時(shí),靜態(tài)變量和構(gòu)造函數(shù)最先被初始化.接著是對(duì)象的實(shí)例化變量和構(gòu)造函數(shù)被初始化
3. 先派生類后基類。對(duì)于變量和靜態(tài)構(gòu)造函數(shù),派生對(duì)象在基對(duì)象之前被初始化.比如C類派生自B類,B類派生自A類,那么變量和靜態(tài)構(gòu)造函數(shù)被初始化次序是C-B-A.
4. 除了實(shí)例構(gòu)造函數(shù)。對(duì)于實(shí)例構(gòu)造函數(shù),基類構(gòu)造函數(shù)在派生類構(gòu)造函數(shù)之前執(zhí)行,實(shí)例構(gòu)造函數(shù)被執(zhí)行次序是A-B-C.
5. 不要假定變量的次序。Fields依據(jù)它們?cè)谠次募械穆暶鞯捻樞蛞来纬跏蓟?然而,自從程序員和工具可以隨意安排變量的聲明后,你不應(yīng)該在依靠變量任何特別的次序初始化
6. 對(duì)虛方法用兩個(gè)階段的構(gòu)建。避免從一個(gè)構(gòu)造器調(diào)用虛方法. 如果在初始化一個(gè)對(duì)象時(shí)需要調(diào)用一些虛方法,應(yīng)在完整構(gòu)造該對(duì)象的地方使用兩階段的構(gòu)建,并隨后調(diào)用已構(gòu)造對(duì)象的初始化方法。
C++構(gòu)造函數(shù)調(diào)用順序
1. 如果類里面有成員類,成員類的構(gòu)造函數(shù)優(yōu)先被調(diào)用;
2. 創(chuàng)建派生類的對(duì)象,基類的構(gòu)造函數(shù)優(yōu)先被調(diào)用(也優(yōu)先于派生類里的成員類);
3. 基類構(gòu)造函數(shù)如果有多個(gè)基類,則構(gòu)造函數(shù)的調(diào)用順序是某類在類派生表中出現(xiàn)的順序而不是它們?cè)诔蓡T初始化表中的順序;
4. 成員類對(duì)象構(gòu)造函數(shù)如果有多個(gè)成員類對(duì)象,則構(gòu)造函數(shù)的調(diào)用順序是對(duì)象在類中被聲明的順序而不是它們出現(xiàn)在成員初始化表中的順序;
5. 派生類構(gòu)造函數(shù),作為一般規(guī)則派生類構(gòu)造函數(shù)應(yīng)該不能直接向一個(gè)基類數(shù)據(jù)成員賦值而是把值傳遞給適當(dāng)?shù)幕悩?gòu)造函數(shù),否則兩個(gè)類的實(shí)現(xiàn)變成緊耦合的(tightly coupled)將更加難于正確地修改或擴(kuò)展基類的實(shí)現(xiàn)。(基類設(shè)計(jì)者的責(zé)任是提供一組適當(dāng)?shù)幕悩?gòu)造函數(shù))
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
- C#類中方法的執(zhí)行順序是什么
- C#類繼承中構(gòu)造函數(shù)的執(zhí)行序列示例詳解
- C#類的多態(tài)性詳解
- C#類中static變量用法分析
- C#類的訪問(wèn)修飾符用法分析
- c#類的使用示例
- C#類中的屬性使用總結(jié)(詳解類的屬性)
- C#類中屬性與成員變量的使用小結(jié)
- C#對(duì)象為Null模式(Null Object Pattern)實(shí)例教程
- c#對(duì)象反序列化與對(duì)象序列化示例詳解
- C#對(duì)象與XMl文件之間的相互轉(zhuǎn)換
- 自定義實(shí)現(xiàn)Json字符串向C#對(duì)象轉(zhuǎn)變的方法
- 關(guān)于C# 類和對(duì)象詳情
相關(guān)文章
C#?微信支付回調(diào)驗(yàn)簽處理的實(shí)現(xiàn)
在微信支付中,當(dāng)用戶支付成功后,微信會(huì)把相關(guān)支付結(jié)果和用戶信息發(fā)送給商戶,本文就詳細(xì)的介紹了C#?微信支付回調(diào)驗(yàn)簽處理,具有一定的參考價(jià)值,感興趣的可以了解一下2021-12-12C#調(diào)用OpenCV開(kāi)發(fā)簡(jiǎn)易版美圖工具【推薦】
本文主要介紹在WPF項(xiàng)目中使用OpenCVSharp3-AnyCPU開(kāi)源類庫(kù)處理圖片,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2019-10-10C# 整數(shù)轉(zhuǎn)二進(jìn)制字符串方式
這篇文章主要介紹了C# 整數(shù)轉(zhuǎn)二進(jìn)制字符串方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-02-02Unity實(shí)現(xiàn)卡牌翻動(dòng)效果
這篇文章主要為大家詳細(xì)介紹了Unity實(shí)現(xiàn)卡牌翻動(dòng)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-02-02