六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

構造函數調用虛函數的進一步探討

[摘要]在blog上看到一篇文章《FxCop 的 ConstructorsShouldNotCallBaseClassVirtualMethods 規范 》原文:http://blog.csdn.net/x...
在blog上看到一篇文章《FxCop 的 ConstructorsShouldNotCallBaseClassVirtualMethods 規范 》原文:http://blog.csdn.net/xamcsdn2/archive/2004/08/11/71766.aspx

頗感興趣,寫了一段代碼研究(估計還稱不上研究,就當探索吧)了一下。

代碼如下。

using System;

namespace test_console
{

??? class baseclass
??? {
??????? public int count = 0;
??????? public baseclass()
??????? {
??????????? Console.WriteLine("Call BaseClass's Constructor Function...");
??????????? Increase("base");
??????? }

??????? public virtual void Increase(string type)
??????? {
??????????? Console.WriteLine(type);
??????????? Console.WriteLine("Call BaseClass's Increase Function...");
??????????? count ++;
??????? }
??? }

??? class subclass:baseclass
??? {
??????? public int subcount = 0;

??????? public subclass()
??????? {
??????????? Console.WriteLine("Call SubClass's Constructor Function...");
??????????? Console.WriteLine(subcount.ToString());
??????????? Increase("sub");
??????? }

??????? public override void Increase(string type)
??????? {
??????????? Console.WriteLine(type);
??????????? Console.WriteLine("Call SubClass's Increase Function...");
??????????? subcount ++;
??????????? Console.WriteLine(subcount.ToString());
??????? }
??????? ///
??????? /// 應用程序的主入口點。
??????? ///
??????? [STAThread]
??????? static void Main(string[] args)
??????? {
??????????? subclass c = new subclass();
??????????? Console.ReadLine();
??????? }
??? }
}


baseclass的構造函數調用了Increase()函數,subclass的構造函數同樣調用了此函數。運行結果如下:

Call BaseClass's Constructor Function...
base
Call SubClass's Increase Function...
1
Call SubClass's Constructor Function...
1
sub
Call SubClass's Increase Function...
2

可以看到SubClass的Increase函數被調用了兩次,我在subclass的increase中加入一個參數來判斷是由哪個構造函數來調用的,結果是先由baseclass調用,再由subclass調用。而且看上去似乎baseclass是先于subclass調用的,但是事實究竟如何呢?我們來看一下subclass的構造函數的IL代碼:

.method public hidebysig specialname rtspecialname instance void .ctor() cil managed
{
????? // Code Size: 51 byte(s)
????? .maxstack 2
????? L_0000: ldarg.0
????? L_0001: ldc.i4.0
????? L_0002: stfld int32 test_console.subclass::subcount
????? L_0007: ldarg.0
????? L_0008: call instance void test_console.baseclass::.ctor()
????? L_000d: ldstr "Call SubClass\'s Constructor Function..."
????? L_0012: call void [mscorlib]System.Console::WriteLine(string)
????? L_0017: ldarg.0
????? L_0018: ldflda int32 test_console.subclass::subcount
????? L_001d: call instance string int32::ToString()
????? L_0022: call void [mscorlib]System.Console::WriteLine(string)
????? L_0027: ldarg.0
????? L_0028: ldstr "sub"
????? L_002d: callvirt instance void test_console.baseclass::Increase(string)
????? L_0032: ret
}
一目了然,L_0008: call instance void test_console.baseclass::.ctor()在subclass的構造函數中先調用了baseclass的構造函數。

?

后記:作為面對對象程序設計者的基本知識,在這里談論子類構造函數先調用父類構造函數這一點似乎有點畫蛇添足,作為小弟的第一篇作品,希望能給那些初學者一些幫助吧。



主站蜘蛛池模板: 一级做a爰片久久免费 | 婷婷深爱五月 | 午夜视频一区二区 | 天天天天色 | 日韩黄色小说 | 欧美伊人久久久久久久久影院 | 野外三级国产在线观看 | 日韩精品福利视频一区二区三区 | 日韩小视频网站 | 日韩欧美福利 | 色综合一区二区三区 | 青草视频入口 在线观看 | 探花系列 | 日产精品一二三四区国产 | 午夜资源网 | 影音先锋国产精品 | 综合久久网 | 午夜精品视频在线观看 | 在线播放国产色视频在线 | 天堂va| 日日久 | 欧美无人区码卡二三卡四卡 | 欧美亚洲另类色国产综合 | 日韩无人区码卡二卡3卡4卡介绍 | 日本高清网 | 中文区永久区乱码六区 | 日本高清视频一区二区三区 | 青青青青青免精品视频 | 色偷偷亚洲第一成人综合网址 | 青草久久影院 | 宅男午夜视频在线观看 | 香蕉欧美成人精品a∨在线观看 | 亚洲乱码一二三四区乱码 | 在线看视频的网站入口 | 一区在线视频 | 天堂а√中文在线 | 青春草视频在线播放 | 亚洲区精品 | 午夜大片免费完整在线看 | 青青在线免费观看 | 日本一区免费观看 |