您好,登錄后才能下訂單哦!
一.ref關鍵字使參數按引用傳遞。其效果是,當控制權傳遞回調用方法時,在方法中對參數所做的任何改變都將反
映在該變量中。若要使用ref參數,則方法定義和調用方法都必須顯式使用ref關鍵字。也即是說,在方法中對參數的
設置和改變將會直接影響函數調用之處。無論函數的定義還是調用時均不可忽略關鍵字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; }
在此可以看出,在方法中對參數所做的任何更改都將反映在該變量中,而在main函數中對參數的賦值卻沒有起到作用
,這是不是說明不需要進行初始化呢?看下面一個例子。
代碼③:
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定義的參數在使用前必須初始化 , 無論在函數定義的時候參數有沒有賦予初始值。這條正好區分
out指定的參數可以不在調用函數的時候進行初始化。
三.對out來說,第一條同樣適用。將代碼①以及②中的ref全部改成out,則可與使用ref得到同樣的結果。
四.out指定的參數必須在函數定義的時候就賦初始值。否則出現錯誤。對比ref指定的參數則
可以不在函數內部賦初始值,在函數調用的時候在函數調用的時候哦在賦值也可以。
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參數,a在參數內部沒有賦值,所以出錯。 a = b;//使用了未賦值的out參數,b在參數內部沒有賦值,所以出錯。 b = temp; }
總結以上四條得到ref和out使用時的區別是:
①.ref指定的參數(例子中的a,b)在函數調用時必須初始化不能為空的引用(x,y)。而指定的參數在函數調用時可以
不初始化(
static void M(ref int a , ref int b) { int temp; temp = a; a = b; b = temp; }
)。
②.out指定的參數在進入函數時會清空自己,必須在函數內部賦初始值。而ref指定的參數不需要。
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()方法中的參數a,b必須在M()方法內部初始化值,x,y隨便。
===========================================================================================
ref和out的區別在C# 中,既可以通過值也可以通過引用傳遞參數。通過引用傳遞參數允許函數成員更改參數的值,并保持該更改。若要通過引用傳遞參數, 可使用ref或out關鍵字。ref和out這兩個關鍵字都能夠提供相似的功效,
其作用也很像C中的指針變量。它們的區別是:
1、使用ref型參數時,傳入的參數必須先被初始化。對out而言,必須在方法中對其完成初始化。
2、使用ref和out時,在方法的參數和執行方法時,都要加Ref或Out關鍵字。以滿足匹配。
3、out適合用在需要retrun多個返回值的地方,而ref則用在需要被調用的方法修改調用者的引用的時候。
out方法參數上的 out 方法參數關鍵字使方法引用傳遞到方法的同一個變量。當控制傳遞回調用方法時,在方法中對參數所做的任何更改都將反映在該變量中。
當希望方法返回多個值時,聲明 out 方法非常有用。使用 out 參數的方法仍然可以返回一個值。一個方法可以有一個以上的 out 參數。
若要使用out參數,必須將參數作為 out 參數顯式傳遞到方法。out 參數的值不會傳遞到 out 參數。
不必初始化作為out參數傳遞的變量。然而,必須在方法返回之前為 out 參數賦值。
屬性不是變量,不能作為out參數傳遞。
ref是有進有出,而out是只出不進。
=======================================================================================
函數參數默認是值傳遞的,也就是“復制一份”。
out和ref傳遞的都是引用而不是值,out側重于輸出使用之前不需賦值而ref在使用之前需要賦值,另外這兩個關鍵字可以變相實現使一個方法輸出多個值。
1.寫一個方法,實現MyTryParse的功能
bool MyTryParse(string s,out intresult)
用戶只能輸入0到100之間的數寫一個方法,否則提示超出范圍
返回值表示解析是否成功,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參與運算 }
調用時: int c;int d; ReturnInt(out c,out d);
如果需要直接將結果返回到某一個變量上 使用ref
public static void ChangeString(ref String s) { s= "000"+s; }
調用時: String ss = "1"; ChangeString(ref ss);
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。