劉鐵猛C#教程學(xué)習(xí)筆記4-2 方法詳解(2)
構(gòu)造器的內(nèi)存原理
使用默認(rèn)構(gòu)造器時(shí)
student類有兩個(gè)字段,其中ID是int類型,是占用四個(gè)字節(jié)的結(jié)構(gòu)體類型
而Name是string類型,是引用類型,占用四個(gè)字節(jié),存儲(chǔ)的是引用的實(shí)例的地址
1.分配內(nèi)存空間
使用默認(rèn)的Student stu = new?Student(); 時(shí),stu是一個(gè)局部變量,應(yīng)該存儲(chǔ)在棧中
圖中綠色為聲明stu變量時(shí)為其準(zhǔn)備的內(nèi)存空間,現(xiàn)在還是空的,要等new操作符執(zhí)行完后將實(shí)例地址存入

new操作符創(chuàng)建實(shí)例時(shí)在堆(自由存儲(chǔ)空間)上開辟內(nèi)存
該類的int字段占4字節(jié),string字段占4字節(jié),所以共開辟8個(gè)字節(jié)的存儲(chǔ)空間
2.初始化
實(shí)例占用的內(nèi)存空間分配好后,就要調(diào)用構(gòu)造器函數(shù)了
構(gòu)造器會(huì)按類型的字段切割分到的內(nèi)存空間,默認(rèn)構(gòu)造器會(huì)將空間內(nèi)值全部刷成0
string變量值都為0時(shí),是NULL值
3.將地址存入引用變量
內(nèi)存分配、初始化結(jié)束后,會(huì)將創(chuàng)建的實(shí)例地址存入引用變量stu
自定義構(gòu)造函數(shù)
會(huì)在第二步初始化時(shí)將值存入實(shí)例的字段
string是引用變量,賦值時(shí)存的又是另一個(gè)實(shí)例的地址

方法的重載(Overload)

如圖所示

Console類里有19個(gè)名字叫WriteLine的方法定義
方法名相同,但這19個(gè)方法的“方法簽名”的不同,按上下鍵可以切換不同的重載定義,會(huì)顯示不同的參數(shù)
只要方法簽名不同,就可以同時(shí)定義同名方法作為重載!
方法簽名
方法簽名由
1.方法的名字
2.方法的類型形參(待續(xù))
3.每一個(gè)參數(shù)(從左到右)的類型、種類(值、引用或輸出)組成
但方法的簽名不包括方法的返回值類型、形參變量名!
錯(cuò)例1:

如圖所示兩個(gè)參數(shù)數(shù)量、類型、種類完全相同,但返回值類型不同的方法
這樣兩個(gè)方法是不能同時(shí)定義的!
錯(cuò)例2:

形參類型、數(shù)量、種類相同,但形參變量名不同,這樣兩個(gè)方法也不能同時(shí)定義!
再次強(qiáng)調(diào):
構(gòu)成方法簽名的:方法名、類型形參(目前未接觸)、從左到右每一個(gè)參數(shù)類型、種類
兩個(gè)方法方法名相同,簽名不同時(shí),就可以重載
補(bǔ)充1:類型形參
使用在泛型方法中
參數(shù)的類型也參與到方法體組成的方法
以上的<T>就是類型形參
類型形參參與構(gòu)成方法簽名
補(bǔ)充2:參數(shù)種類(引用傳遞、值傳遞)
以上不加額外修飾符的參數(shù)默認(rèn)為值參數(shù)
若在參數(shù)類型前加上修飾符ref,就會(huì)將其轉(zhuǎn)換為引用傳遞的參數(shù)
若在參數(shù)類型前加上修飾符out,就會(huì)將其轉(zhuǎn)換為輸出參數(shù)
稱作參數(shù)的種類,參數(shù)的種類參與構(gòu)成參數(shù)簽名
實(shí)例構(gòu)造器也可以使用重載,構(gòu)造器的簽名由方法名(與類型名相同的)、形參列表構(gòu)成
重載決策
根據(jù)調(diào)用時(shí)傳遞進(jìn)方法的參數(shù)的數(shù)量、類型來決定使用哪個(gè)方法定義
方法的debug(以VS中為例)

1.斷點(diǎn)
在代碼一行前面的空白點(diǎn)一下,設(shè)置斷點(diǎn)后,在調(diào)試模式運(yùn)行時(shí),程序運(yùn)行到這一行時(shí)會(huì)暫停,此時(shí)可以觀察程序的狀態(tài),在VS中此時(shí)將鼠標(biāo)放在任意一個(gè)變量上,會(huì)顯示該變量當(dāng)前的值


2.Call stack(調(diào)用棧)
“call stack”窗口會(huì)顯示調(diào)用了斷點(diǎn)所在語句的地方
有幾層牽涉到斷點(diǎn)的調(diào)用關(guān)系,call stack就有幾層,就更深
可以稱作調(diào)用棧
遞歸方法如果出現(xiàn)無限遞歸,調(diào)用棧就會(huì)越來越深,最后導(dǎo)致內(nèi)存爆棧
3.Step into(步入、逐步執(zhí)行)
快捷鍵為F11
單步執(zhí)行,遇到子函數(shù)就進(jìn)入并且繼續(xù)單步執(zhí)行

按F11鍵,跳轉(zhuǎn)到當(dāng)前選中的正在被調(diào)用的函數(shù)的函數(shù)體
每按一次F11,call stack窗口就會(huì)減少一層
(在調(diào)用關(guān)系上走到上一層,對(duì)調(diào)用關(guān)系抽絲剝繭)
“最細(xì)膩的debug方式”
4.Step over(步過)
快捷鍵為F10
在單步執(zhí)行時(shí),在函數(shù)內(nèi)遇到子函數(shù)時(shí)不會(huì)進(jìn)入子函數(shù)內(nèi)單步執(zhí)行,而是將子函數(shù)整個(gè)執(zhí)行完在停止,也就是把子函數(shù)整個(gè)作為一步

遇到調(diào)用函數(shù)時(shí),直接走完此函數(shù)得到結(jié)果
對(duì)確認(rèn)無問題的函數(shù),可以用F10跳過,對(duì)有懷疑的函數(shù),可以按F11走進(jìn)去逐步檢查
“稍粗曠一些的debug方式”
5.Step out
在單步執(zhí)行到子函數(shù)內(nèi)時(shí),用Step out就可以執(zhí)行完子函數(shù)余下部分,并返回上一層函數(shù)。

6.觀察局部變量的值的變化
在local窗口中可觀察當(dāng)前打有斷點(diǎn)的函數(shù)內(nèi)的局部變量的值
