一.ref關(guān)鍵字使參數(shù)按引用傳遞。其效果是,當(dāng)控制權(quán)傳遞回調(diào)用方法時,在方法中對參數(shù)所做的任何改變都將反
映在該變量中。若要使用ref參數(shù),則方法定義和調(diào)用方法都必須顯式使用ref關(guān)鍵字。也即是說,在方法中對參數(shù)的
設(shè)置和改變將會直接影響函數(shù)調(diào)用之處。無論函數(shù)的定義還是調(diào)用時均不可忽略關(guān)鍵字ref。
代碼①:
static void Main(string[] args) { int x = 10; int y = 20; M(ref x, ref y); Console.WriteLine("x = {0} , y = {1}" , x , y); Console.ReadLine(); } static void M(ref int a , ref int b) { a = 521; b = 520; }
代碼②:
static void Main(string[] args) { int x = 10; int y = 20; M(ref x, ref y); Console.WriteLine("x = {0} , y = {1}" , x , y); Console.ReadLine(); } static void M(ref int a , ref int b) { a = 1000; b = 1; }
在此可以看出,在方法中對參數(shù)所做的任何更改都將反映在該變量中,而在main函數(shù)中對參數(shù)的賦值卻沒有起到作用
,這是不是說明不需要進行初始化呢?看下面一個例子。
代碼③:
static void Main(string[] args) { int x ; int y ; M(ref x, ref y); //使用了未賦值的局部變量 x,y 。必須要初始化,否則編譯通不過 Console.WriteLine("x = {0} , y = {1}" , x , y); Console.ReadLine(); } static void M(ref int a , ref int b) { a = 521; b = 520; }
二.這說明,ref定義的參數(shù)在使用前必須初始化 , 無論在函數(shù)定義的時候參數(shù)有沒有賦予初始值。這條正好區(qū)分
out指定的參數(shù)可以不在調(diào)用函數(shù)的時候進行初始化。
三.對out來說,第一條同樣適用。將代碼①以及②中的ref全部改成out,則可與使用ref得到同樣的結(jié)果。
四.out指定的參數(shù)必須在函數(shù)定義的時候就賦初始值。否則出現(xiàn)錯誤。對比ref指定的參數(shù)則
可以不在函數(shù)內(nèi)部賦初始值,在函數(shù)調(diào)用的時候在函數(shù)調(diào)用的時候哦在賦值也可以。
static void Main(string[] args) { int x = 10; int y = 11; M(ref x, ref y); Console.WriteLine("x = {0} , y = {1}" , x , y); Console.ReadLine(); } static void M(ref int a , ref int b) { int temp; temp = a; a = b; b = temp; }
代碼④:
static void Main(string[] args) { int x = 10; int y = 11; M(out x, out y); Console.WriteLine("x = {0} , y = {1}" , x , y); Console.ReadLine(); } static void M(out int a , out int b) { int temp; temp = a;//使用了未賦值的out參數(shù),a在參數(shù)內(nèi)部沒有賦值,所以出錯。 a = b;//使用了未賦值的out參數(shù),b在參數(shù)內(nèi)部沒有賦值,所以出錯。 b = temp; }
總結(jié)以上四條得到ref和out使用時的區(qū)別是:
①.ref指定的參數(shù)(例子中的a,b)在函數(shù)調(diào)用時必須初始化不能為空的引用(x,y)。而指定的參數(shù)在函數(shù)調(diào)用時可以
不初始化(
static void M(ref int a , ref int b) { int temp; temp = a; a = b; b = temp; }
)。
②.out指定的參數(shù)在進入函數(shù)時會清空自己,必須在函數(shù)內(nèi)部賦初始值。而ref指定的參數(shù)不需要。
static void Main(string[] args) { int x ; int y ; M(out x, out y); Console.WriteLine("x = {0} , y = {1}" , x , y); Console.ReadLine(); } static void M(out int a, out int b) { a = 1111; b = 22222; }
用ref時,例子中的x,y必須初始化值,a,b隨便;用out時,M()方法中的參數(shù)a,b必須在M()方法內(nèi)部初始化值,x,y隨便。
===========================================================================================
ref和out的區(qū)別在C# 中,既可以通過值也可以通過引用傳遞參數(shù)。通過引用傳遞參數(shù)允許函數(shù)成員更改參數(shù)的值,并保持該更改。若要通過引用傳遞參數(shù), 可使用ref或out關(guān)鍵字。ref和out這兩個關(guān)鍵字都能夠提供相似的功效,
其作用也很像C中的指針變量。它們的區(qū)別是:
1、使用ref型參數(shù)時,傳入的參數(shù)必須先被初始化。對out而言,必須在方法中對其完成初始化。
2、使用ref和out時,在方法的參數(shù)和執(zhí)行方法時,都要加Ref或Out關(guān)鍵字。以滿足匹配。
3、out適合用在需要retrun多個返回值的地方,而ref則用在需要被調(diào)用的方法修改調(diào)用者的引用的時候。
out方法參數(shù)上的 out 方法參數(shù)關(guān)鍵字使方法引用傳遞到方法的同一個變量。當(dāng)控制傳遞回調(diào)用方法時,在方法中對參數(shù)所做的任何更改都將反映在該變量中。
當(dāng)希望方法返回多個值時,聲明 out 方法非常有用。使用 out 參數(shù)的方法仍然可以返回一個值。一個方法可以有一個以上的 out 參數(shù)。
若要使用out參數(shù),必須將參數(shù)作為 out 參數(shù)顯式傳遞到方法。out 參數(shù)的值不會傳遞到 out 參數(shù)。
不必初始化作為out參數(shù)傳遞的變量。然而,必須在方法返回之前為 out 參數(shù)賦值。
屬性不是變量,不能作為out參數(shù)傳遞。
ref是有進有出,而out是只出不進。
=======================================================================================
函數(shù)參數(shù)默認是值傳遞的,也就是“復(fù)制一份”。
out和ref傳遞的都是引用而不是值,out側(cè)重于輸出使用之前不需賦值而ref在使用之前需要賦值,另外這兩個關(guān)鍵字可以變相實現(xiàn)使一個方法輸出多個值。
1.寫一個方法,實現(xiàn)MyTryParse的功能
bool MyTryParse(string s,out intresult)
用戶只能輸入0到100之間的數(shù)寫一個方法,否則提示超出范圍
返回值表示解析是否成功,result代表解析后的整型值
1.形參和實參指向同一地址
2.始終保證形參和實參指向同一地址
ref和out不一樣:
ref在實參傳入時保留其值 而out消除其值
方法編寫的時候的選擇:
若方法只有一個返回值 選擇使用返回值類型
例:
public static int ReturnInt() { return 1; }
如果返回值多于1個 選擇使用out
public static void ReturnInt(out int a,out int b) { //a、b賦初值 // a、b參與運算 }
調(diào)用時: int c;int d; ReturnInt(out c,out d);
如果需要直接將結(jié)果返回到某一個變量上 使用ref
public static void ChangeString(ref String s) { s= "000"+s; }
調(diào)用時: String ss = "1"; ChangeString(ref ss);
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
網(wǎng)站名稱:ref與out-創(chuàng)新互聯(lián)
分享網(wǎng)址:http://chinadenli.net/article2/ddgeoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、網(wǎng)站維護、響應(yīng)式網(wǎng)站、網(wǎng)站策劃、App設(shè)計、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容