|
學(xué)過(guò)C/C++的人,對(duì)C#的關(guān)鍵字Ref和Out應(yīng)該都很好理解。它們都提供了一種可以在被調(diào)用函數(shù)內(nèi)修改傳遞的參數(shù)的值的方法。因?yàn)檫@一功能很類(lèi)似C/C++的指針。對(duì)于沒(méi)學(xué)過(guò)C/C++的,也應(yīng)該可以明白這兩個(gè)參數(shù)的作用。
雖然Ref和Out都提供了修改參數(shù)值的方法,但它們還是有一點(diǎn)點(diǎn)小的區(qū)別。
1、Ref在作為參數(shù)調(diào)用函數(shù)之前,變量一定要賦值,否則會(huì)得到一個(gè)常規(guī)編譯錯(cuò)誤:使用了未賦值的變量。
2、在被調(diào)用函數(shù)內(nèi),以Ref引入的參數(shù)在返回前不必為它賦值。
3、Out在作為參數(shù)調(diào)用函數(shù)之前,變量可以不被賦值。
4、在被調(diào)用函數(shù)內(nèi),以O(shè)ut引入的參數(shù)在返回前一定要至少賦值一次。
其實(shí)本質(zhì)上講,Ref更適合理解為給被調(diào)用函數(shù)傳遞了一個(gè)與原參考同地址的變量。而Out則可以理解為在調(diào)用函數(shù)前,先給變量找個(gè)地方,讓被調(diào)用函數(shù)在給定地點(diǎn)放一個(gè)值。
看上去很簡(jiǎn)單不是嗎?確實(shí)如此,這里是一個(gè)例子:






















variable by reference.





















current mothod.



1、如果是用Ref,那么結(jié)果是和什么都沒(méi)用一樣!即默認(rèn)就是用的Ref。(讓我們少打了幾個(gè)字符)
2、如果是用Out,那么要遵守上面的3,4原則,即:在調(diào)用前,不必初始化引用對(duì)象,再簡(jiǎn)單一點(diǎn):就是可以不用New一個(gè)對(duì)象。但在函數(shù)內(nèi),返回前一定要New一個(gè),并且在New之前,參數(shù)對(duì)象是不能使用的。
也就是上面說(shuō)到的,Out只是在調(diào)用前分配了一個(gè)地點(diǎn),在調(diào)用函數(shù)中使用該地點(diǎn)。注意:這里“地點(diǎn)”一詞決不是內(nèi)存地址。
再思考一個(gè)問(wèn)題:如果在使用Out參考時(shí),在調(diào)用函數(shù)前,我們已經(jīng)New了一個(gè)對(duì)象,再來(lái)調(diào)用函數(shù)結(jié)果會(huì)是什么呢?
你將“丟失”一部份內(nèi)存(如果在C/C++里,一定是這樣的)。也就是說(shuō),在調(diào)用了函數(shù)后,函數(shù)里New的一個(gè)對(duì)象會(huì)讓函數(shù)外的對(duì)象丟失,而新的對(duì)象在函數(shù)內(nèi)有效,在函數(shù)外也有效。幸運(yùn)的是:原來(lái)的對(duì)象的內(nèi)存并不會(huì)像C/C++那樣完全的丟失,它將由垃圾回收器來(lái)管理了。所以我們并不擔(dān)心內(nèi)存的真正丟失問(wèn)題(這真是一件值得慶幸的事)。
看這樣的例子:




































NET技術(shù):深入剖析引用參數(shù)Ref和Out,轉(zhuǎn)載需保留來(lái)源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。