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類(lèi)中被重載,因此輸出 x=1,y=0
Console.WriteLine("在A類(lèi)的構(gòu)造函數(shù)中");
PrintFields();
}
public virtual void PrintFields() { }
}
class B : A {
//派生類(lèi)變量/靜態(tài)成員的執(zhí)行順序優(yōu)于基類(lèi)
//先變量,因此,x=1,y=0
int x = 1;
int y;
//后構(gòu)造函數(shù),此時(shí),先調(diào)用基類(lèi)構(gòu)造函數(shù)
public B() {
//運(yùn)行到這里時(shí),A類(lèi)構(gòu)造函數(shù)已經(jīng)執(zhí)行完畢
y = -1;
Console.WriteLine("在B類(lèi)的構(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è)類(lèi)被訪問(wèn)時(shí),靜態(tài)變量和構(gòu)造函數(shù)最先被初始化.接著是對(duì)象的實(shí)例化變量和構(gòu)造函數(shù)被初始化
3. 先派生類(lèi)后基類(lèi)。對(duì)于變量和靜態(tài)構(gòu)造函數(shù),派生對(duì)象在基對(duì)象之前被初始化.比如C類(lèi)派生自B類(lèi),B類(lèi)派生自A類(lèi),那么變量和靜態(tài)構(gòu)造函數(shù)被初始化次序是C-B-A.
4. 除了實(shí)例構(gòu)造函數(shù)。對(duì)于實(shí)例構(gòu)造函數(shù),基類(lèi)構(gòu)造函數(shù)在派生類(lèi)構(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. 如果類(lèi)里面有成員類(lèi),成員類(lèi)的構(gòu)造函數(shù)優(yōu)先被調(diào)用;
2. 創(chuàng)建派生類(lèi)的對(duì)象,基類(lèi)的構(gòu)造函數(shù)優(yōu)先被調(diào)用(也優(yōu)先于派生類(lèi)里的成員類(lèi));
3. 基類(lèi)構(gòu)造函數(shù)如果有多個(gè)基類(lèi),則構(gòu)造函數(shù)的調(diào)用順序是某類(lèi)在類(lèi)派生表中出現(xiàn)的順序而不是它們?cè)诔蓡T初始化表中的順序;
4. 成員類(lèi)對(duì)象構(gòu)造函數(shù)如果有多個(gè)成員類(lèi)對(duì)象,則構(gòu)造函數(shù)的調(diào)用順序是對(duì)象在類(lèi)中被聲明的順序而不是它們出現(xiàn)在成員初始化表中的順序;
5. 派生類(lèi)構(gòu)造函數(shù),作為一般規(guī)則派生類(lèi)構(gòu)造函數(shù)應(yīng)該不能直接向一個(gè)基類(lèi)數(shù)據(jù)成員賦值而是把值傳遞給適當(dāng)?shù)幕?lèi)構(gòu)造函數(shù),否則兩個(gè)類(lèi)的實(shí)現(xiàn)變成緊耦合的(tightly coupled)將更加難于正確地修改或擴(kuò)展基類(lèi)的實(shí)現(xiàn)。(基類(lèi)設(shè)計(jì)者的責(zé)任是提供一組適當(dāng)?shù)幕?lèi)構(gòu)造函數(shù))
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
您可能感興趣的文章:- C#類(lèi)中方法的執(zhí)行順序是什么
- C#類(lèi)繼承中構(gòu)造函數(shù)的執(zhí)行序列示例詳解
- C#類(lèi)的多態(tài)性詳解
- C#類(lèi)中static變量用法分析
- C#類(lèi)的訪問(wèn)修飾符用法分析
- c#類(lèi)的使用示例
- C#類(lèi)中的屬性使用總結(jié)(詳解類(lèi)的屬性)
- C#類(lèi)中屬性與成員變量的使用小結(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# 類(lèi)和對(duì)象詳情
相關(guān)文章
-
簡(jiǎn)單的excel導(dǎo)入導(dǎo)出示例分享
這篇文章主要介紹了簡(jiǎn)單的excel導(dǎo)入導(dǎo)出示例分享,需要的朋友可以參考下 2014-03-03
-
WinForm特效之桌面上的遮罩層實(shí)現(xiàn)方法
這篇文章主要介紹了WinForm特效之桌面上的遮罩層實(shí)現(xiàn)方法,是一個(gè)非常實(shí)用的技巧,需要的朋友可以參考下 2014-09-09
-
c#使用微信接口開(kāi)發(fā)微信門(mén)戶(hù)應(yīng)用中微信消息的處理和應(yīng)答
這篇文章主要介紹了c#使用微信接口開(kāi)發(fā)微信門(mén)戶(hù)中的微信消息的處理和應(yīng)答的過(guò)程,需要的朋友可以參考下 2014-03-03
-
基于C#實(shí)現(xiàn)ModbusTCP服務(wù)器接口的方法
ModbusTCP服務(wù)器的本質(zhì)就是TCP服務(wù)器,根據(jù)識(shí)別ModbusTCP請(qǐng)求報(bào)文,返回對(duì)應(yīng)的ModbusTCP報(bào)文,今天給大家分享一下,如何基于C#來(lái)ModbusTCP服務(wù)器接口,需要的朋友可以參考下 2025-01-01
-
C#通過(guò)yield實(shí)現(xiàn)數(shù)組全排列的方法
這篇文章主要介紹了C#通過(guò)yield實(shí)現(xiàn)數(shù)組全排列的方法,以實(shí)例形式較為詳細(xì)的分析了全排列的概念及C#的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下 2015-03-03
-
C#常用多線程(線程同步,事件觸發(fā),信號(hào)量,互斥鎖,共享內(nèi)存,消息隊(duì)列)
這篇文章主要介紹了C#常用多線程(線程同步,事件觸發(fā),信號(hào)量,互斥鎖,共享內(nèi)存,消息隊(duì)列),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下 2023-09-09
最新評(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類(lèi)中被重載,因此輸出 x=1,y=0
Console.WriteLine("在A類(lèi)的構(gòu)造函數(shù)中");
PrintFields();
}
public virtual void PrintFields() { }
}
class B : A {
//派生類(lèi)變量/靜態(tài)成員的執(zhí)行順序優(yōu)于基類(lèi)
//先變量,因此,x=1,y=0
int x = 1;
int y;
//后構(gòu)造函數(shù),此時(shí),先調(diào)用基類(lèi)構(gòu)造函數(shù)
public B() {
//運(yùn)行到這里時(shí),A類(lèi)構(gòu)造函數(shù)已經(jīng)執(zhí)行完畢
y = -1;
Console.WriteLine("在B類(lèi)的構(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è)類(lèi)被訪問(wèn)時(shí),靜態(tài)變量和構(gòu)造函數(shù)最先被初始化.接著是對(duì)象的實(shí)例化變量和構(gòu)造函數(shù)被初始化
3. 先派生類(lèi)后基類(lèi)。對(duì)于變量和靜態(tài)構(gòu)造函數(shù),派生對(duì)象在基對(duì)象之前被初始化.比如C類(lèi)派生自B類(lèi),B類(lèi)派生自A類(lèi),那么變量和靜態(tài)構(gòu)造函數(shù)被初始化次序是C-B-A.
4. 除了實(shí)例構(gòu)造函數(shù)。對(duì)于實(shí)例構(gòu)造函數(shù),基類(lèi)構(gòu)造函數(shù)在派生類(lèi)構(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. 如果類(lèi)里面有成員類(lèi),成員類(lèi)的構(gòu)造函數(shù)優(yōu)先被調(diào)用;
2. 創(chuàng)建派生類(lèi)的對(duì)象,基類(lèi)的構(gòu)造函數(shù)優(yōu)先被調(diào)用(也優(yōu)先于派生類(lèi)里的成員類(lèi));
3. 基類(lèi)構(gòu)造函數(shù)如果有多個(gè)基類(lèi),則構(gòu)造函數(shù)的調(diào)用順序是某類(lèi)在類(lèi)派生表中出現(xiàn)的順序而不是它們?cè)诔蓡T初始化表中的順序;
4. 成員類(lèi)對(duì)象構(gòu)造函數(shù)如果有多個(gè)成員類(lèi)對(duì)象,則構(gòu)造函數(shù)的調(diào)用順序是對(duì)象在類(lèi)中被聲明的順序而不是它們出現(xiàn)在成員初始化表中的順序;
5. 派生類(lèi)構(gòu)造函數(shù),作為一般規(guī)則派生類(lèi)構(gòu)造函數(shù)應(yīng)該不能直接向一個(gè)基類(lèi)數(shù)據(jù)成員賦值而是把值傳遞給適當(dāng)?shù)幕?lèi)構(gòu)造函數(shù),否則兩個(gè)類(lèi)的實(shí)現(xiàn)變成緊耦合的(tightly coupled)將更加難于正確地修改或擴(kuò)展基類(lèi)的實(shí)現(xiàn)。(基類(lèi)設(shè)計(jì)者的責(zé)任是提供一組適當(dāng)?shù)幕?lèi)構(gòu)造函數(shù))
希望本文所述對(duì)大家的C#程序設(shè)計(jì)有所幫助。
- C#類(lèi)中方法的執(zhí)行順序是什么
- C#類(lèi)繼承中構(gòu)造函數(shù)的執(zhí)行序列示例詳解
- C#類(lèi)的多態(tài)性詳解
- C#類(lèi)中static變量用法分析
- C#類(lèi)的訪問(wèn)修飾符用法分析
- c#類(lèi)的使用示例
- C#類(lèi)中的屬性使用總結(jié)(詳解類(lèi)的屬性)
- C#類(lèi)中屬性與成員變量的使用小結(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# 類(lèi)和對(duì)象詳情
相關(guān)文章
簡(jiǎn)單的excel導(dǎo)入導(dǎo)出示例分享
這篇文章主要介紹了簡(jiǎn)單的excel導(dǎo)入導(dǎo)出示例分享,需要的朋友可以參考下2014-03-03
WinForm特效之桌面上的遮罩層實(shí)現(xiàn)方法
這篇文章主要介紹了WinForm特效之桌面上的遮罩層實(shí)現(xiàn)方法,是一個(gè)非常實(shí)用的技巧,需要的朋友可以參考下2014-09-09
c#使用微信接口開(kāi)發(fā)微信門(mén)戶(hù)應(yīng)用中微信消息的處理和應(yīng)答
這篇文章主要介紹了c#使用微信接口開(kāi)發(fā)微信門(mén)戶(hù)中的微信消息的處理和應(yīng)答的過(guò)程,需要的朋友可以參考下2014-03-03
基于C#實(shí)現(xiàn)ModbusTCP服務(wù)器接口的方法
ModbusTCP服務(wù)器的本質(zhì)就是TCP服務(wù)器,根據(jù)識(shí)別ModbusTCP請(qǐng)求報(bào)文,返回對(duì)應(yīng)的ModbusTCP報(bào)文,今天給大家分享一下,如何基于C#來(lái)ModbusTCP服務(wù)器接口,需要的朋友可以參考下2025-01-01
C#通過(guò)yield實(shí)現(xiàn)數(shù)組全排列的方法
這篇文章主要介紹了C#通過(guò)yield實(shí)現(xiàn)數(shù)組全排列的方法,以實(shí)例形式較為詳細(xì)的分析了全排列的概念及C#的實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
C#常用多線程(線程同步,事件觸發(fā),信號(hào)量,互斥鎖,共享內(nèi)存,消息隊(duì)列)
這篇文章主要介紹了C#常用多線程(線程同步,事件觸發(fā),信號(hào)量,互斥鎖,共享內(nèi)存,消息隊(duì)列),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09

