回复:lerit的关于对象中字段的初始化问题
???? 謝謝lerit的對(duì)于我的博文《內(nèi)存探尋1之——值類型和引用類型的內(nèi)存分配機(jī)制》中提到的問(wèn)題。這里先重述問(wèn)題:
?"你好,你的文章寫得很好,清晰了很多以前比較模糊的概念,我想提個(gè)問(wèn)題,上面你總結(jié)了自定義對(duì)象的過(guò)程,那三條是按照順序的嗎?
另外,下面這個(gè)類,是先實(shí)例化字段,還是先構(gòu)造器,我從第三條中看出是“初始化構(gòu)造器,對(duì)對(duì)象字段初始化”,可是好像是構(gòu)造函數(shù)后執(zhí)行了,請(qǐng)指教
public class c
{
public int a = 9;
public c()
{
a = 0;
}
}"
?
其實(shí)我對(duì)于字段的初始化以前沒有在意,在這里謝謝你的評(píng)論,使我關(guān)注到了它。我的解釋是:
?
我的分析:
首先:我理解你的問(wèn)題主要是:類中的字段(ex,上例中的 a)的初始化問(wèn)題! (呵呵,希望沒有錯(cuò)~);
其次:我對(duì)于對(duì)象的內(nèi)存分配順序是(由博文《內(nèi)存探尋1之——值類型和引用類型的內(nèi)存分配機(jī)制》):
?
1.構(gòu)造實(shí)例化對(duì)象中TypeHandler所指向的對(duì)象(可認(rèn)為是Method Table),包括實(shí)現(xiàn)接口、靜態(tài)字段、方法等,并提交至Loader Heap上;
2. 初始化實(shí)例的2個(gè)附加成員(TypeHandler和SyncBlockIndex),并且將TypeHandler指針指向Method Table;
3.初始化構(gòu)造器,對(duì)對(duì)象字段初始化;
?
我想用一例子看一下效果:
?1?//Description:?通過(guò)建立類TestClass,演示對(duì)象的內(nèi)存分配機(jī)制?2?
?3?//CopyRight:?http://www.cnblogs.com/yangmingming
?4?
?5?//Notes:?為簡(jiǎn)便,將類的建立,和實(shí)例化類放于一起
?6?
?7?namespace?ConsoleApplication1
?8?{
?9????public??class?TestClass
10?????{
11????????public?int?c?;
12?
13????????public?TestClass(int?cc)
14????????{
15????????????c?=?cc;
16????????}
17?????}
18?}
19?
20?class?Program
21?????{
22?????????static?void?Main(string[]?args)
23?????????{
24?????????????TestClass?tc?=?new?TestClass(5);
25?????????????Console.WriteLine(tc.c);
26?????????}
27?????}
28?//輸出為:5?
? 為說(shuō)明方便,我們?cè)?5行設(shè)定斷點(diǎn),經(jīng)調(diào)試,其界面為:
?
可見,如你所言,對(duì)象中字段在調(diào)用構(gòu)造函數(shù)前,已經(jīng)有值了!然而在這里我想我們的理解會(huì)有誤差,具體分析如下:
一: 我上面所講的"初始化構(gòu)造器,對(duì)對(duì)象字段初始化",可以肯定的說(shuō),你理解的與我不同(呵呵,必須的~)。我的理解是——調(diào)用構(gòu)造函數(shù),而其主要作用是對(duì)其中字段初始化!(你的理解是先后順序執(zhí)行?!);
二:我認(rèn)為可以認(rèn)為類中字段的直接賦值(如你例中:public int a = 9;) 為在內(nèi)存直接分配完畢后,給字段相應(yīng)位置賦值,這或許可以被稱為字段初始化(雖然我對(duì)這種方式不甚熟悉)。即:對(duì)字段的賦值是在我的上述對(duì)象內(nèi)存分配過(guò)程3過(guò)程之前執(zhí)行的!
三:從我的上例中看到,當(dāng)未對(duì)字段賦初值時(shí)(實(shí)質(zhì)上,系統(tǒng)出于C#的類型安全性要求會(huì)對(duì)字段類型分別賦初值0或null), 在調(diào)用構(gòu)造函數(shù)前字段已經(jīng)采取了初始賦值:0;
?
附:之所以會(huì)對(duì)我的說(shuō)明產(chǎn)生誤解(或者,我的說(shuō)明不清晰)主要因?yàn)?/p>
1;在C++中,構(gòu)造函數(shù)的作用即:為字段賦初值;
2:關(guān)于初始化,在C++中是不允許直接使用: public int a = 9;的,這樣會(huì)報(bào)錯(cuò)。它采用了一種比較特殊的為字段初始化的方式(提供默認(rèn)值-聲明與定義分離,這里不闡述)。而C#中的字段初始化應(yīng)在內(nèi)存分配完成后直接完成的;
3:因?yàn)槲译m然學(xué)習(xí)了C#,可能由于還沒有在工作中更多實(shí)踐,所以C++思想還很"豐富"的緣故(呵呵,盡快轉(zhuǎn)變~);
?
最后,還是感謝lerit的問(wèn)題,讓我有了更多思考,希望以后繼續(xù)交流!
?
?
?
??
?
轉(zhuǎn)載于:https://www.cnblogs.com/yangmingming/archive/2010/02/09/1666859.html
總結(jié)
以上是生活随笔為你收集整理的回复:lerit的关于对象中字段的初始化问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 使用GeocodeService进行地理
- 下一篇: Memcached安装和基本使用