ref 和 out 之間的江湖趣聞
本片文章將詳細(xì)介紹一下在C#中的關(guān)鍵字:ref 和 out 的使用和區(qū)別
話不多說(shuō)另凌,下面開(kāi)始介紹啦
引用參數(shù)和輸出參數(shù)
按照國(guó)際慣例羽圃,要了解一個(gè)東西的時(shí)候荷愕,首先明白它是什么已骇,然后明白它能做什么游沿,最后要知道為什么像樊。
所以在介紹ref和out之前要先簡(jiǎn)單了解一下什么是引用參數(shù)與輸出參數(shù)泽西,因?yàn)槭褂胷ef和out要有所了解
引用參數(shù):
引用參數(shù)是一個(gè)對(duì)變量的內(nèi)存位置的引用佛纫。當(dāng)按引用傳遞參數(shù)時(shí)缝彬,與值參數(shù)不同的是萌焰,它不會(huì)為這些參數(shù)創(chuàng)建一個(gè)新的存儲(chǔ)位置。引用參數(shù)表示與提供給方法的實(shí)際參數(shù)具有相同的內(nèi)存位置谷浅。
引用參數(shù)在方法中使用時(shí)必須為其賦值扒俯,并且必須是由變量賦予的值,不能是常量或表達(dá)式一疯。如果需要將方法中的每一個(gè)參數(shù)都設(shè)置為ref類型參數(shù)撼玄,則需要在每一個(gè)參數(shù)前面加上ref關(guān)鍵字修飾。
在 C# 中墩邀,使用 ref 關(guān)鍵字聲明引用參數(shù)
輸出參數(shù):
return 語(yǔ)句可用于只從函數(shù)中返回一個(gè)值掌猛。但是,可以使用 輸出參數(shù) 來(lái)從函數(shù)中返回兩個(gè)值眉睹。輸出參數(shù)會(huì)把方法輸出的數(shù)據(jù)賦給自己荔茬,其他方面與引用參數(shù)相似。輸出參數(shù)相當(dāng)于返回值辣往,即在方法調(diào)用完成后可以將返回的結(jié)果存放到輸出參數(shù)中兔院。
在 C# 中,使用 out關(guān)鍵字聲明輸出參數(shù)
ref 和 out 的定義
簡(jiǎn)單了解一下引用參數(shù)與輸出參數(shù)站削,下面就可以對(duì)ref和out有一個(gè)更清楚的定位和認(rèn)知了坊萝。
再簡(jiǎn)單介紹一下ref和out
ref:“The ref keyword indicates a value that is passed by reference.”
ref也是Reference的縮寫,意思就是通過(guò)引用來(lái)傳遞參數(shù)许起。
out:As a parameter modifier, which lets you pass an argument to a method by reference rather than by value./“out”作為一個(gè)參數(shù)修飾符十偶,允許您通過(guò)引用而不是通過(guò)值將參數(shù)傳遞給方法
ref和out的使用
//不使用ref和out
void Method(int a)
{
? ? a= 100;
}
int a=0;
Method(a);
Console.WriteLine(a);
//輸出:0
//使用ref
void Method(ref int Refa)
{
? ? Refa= 100;
}
int a= 1;
Method(ref a);
Console.WriteLine(a);
**//輸出:100**
//使用out
void Method(out int Outa)
{
? ? Outa= 100;
}
int a;
Method(out a);
Console.WriteLine(a);
//輸出:100
上面舉了三個(gè)簡(jiǎn)單的方法,分別是不使用修飾符园细,使用ref惦积,和使用out
可以看出,在使用ref猛频、out后狮崩,a的值經(jīng)過(guò)調(diào)用了Method方法后是改變了的,就是因?yàn)閞ef和out是用的地址傳參
而不使用的時(shí)候是按值傳參鹿寻,a的值不會(huì)發(fā)生變化
ref和out的區(qū)別
我們這里著重看一下ref和out的使用區(qū)別
用ref的時(shí)候睦柴,我們需要在調(diào)用方法之前給a賦初值,不然就會(huì)如下報(bào)錯(cuò)毡熏,而out則不需要坦敌。
盡管作為 out 參數(shù)傳遞的變量不必在傳遞之前進(jìn)行初始化,但是out也有要求,使用out的時(shí)候狱窘,必須在方法體內(nèi)給其賦值杜顺,賦值之后可以進(jìn)行使用,未賦值時(shí)不能用蘸炸,但是ref不需要躬络。
例如下圖所示,并未給Refa賦值就可調(diào)用搭儒,而Outb未賦值之前不可調(diào)用洗鸵,賦值之后才可調(diào)用。而且如果方法體內(nèi)未給Outb賦值的話仗嗦,VS會(huì)報(bào)錯(cuò)。
在使用out的時(shí)候甘凭,不管有沒(méi)有對(duì)靜態(tài)變量b賦值稀拐,只要出使用out修飾符,就必須對(duì)out修飾的參數(shù)Outb賦值丹弱。
所以out應(yīng)該是在方法內(nèi)部做了分配地址的操作德撬,然后把地址賦給外部的變量。但是ref的話是直接傳遞外部地址進(jìn)方法躲胳。
總結(jié)
ref和out傳參使用的時(shí)候蜓洪,使用的是所傳參的地址,所以在使用之后自身的值會(huì)發(fā)生改變坯苹。
使用ref的時(shí)候隆檀,必須先給ref的參數(shù)賦值才能使用,而out則是在方法體中必須給out的參數(shù)賦值粹湃,才可使用恐仑。
關(guān)鍵字“ref“和”out”之間的唯一區(qū)別:使用ref需先賦初值,使用out則需在方法體中賦值为鳄。
整體來(lái)說(shuō)裳仆,系統(tǒng)對(duì)ref的限制是更少一些的。out雖然不要求在調(diào)用前一定要初始化孤钦,但是其值在函數(shù)內(nèi)部是不可見(jiàn)的歧斟,也就是不能使用通過(guò)out傳進(jìn)來(lái)的值,并且一定要在函數(shù)內(nèi)賦一個(gè)值偏形【残洌或者說(shuō)函數(shù)承擔(dān)初始化這個(gè)變量的責(zé)任。
就先介紹到這里了壳猜,如果還有什么需要補(bǔ)充的或者文章哪里有紕漏都可以評(píng)論說(shuō)一下哦