ref和out的區別在C#
中,既可以通過值也可以通過引用傳遞參數。通過引用傳遞參數允許函數成員更改參數的值,並保持該更改。若要通過引用傳遞參數,
可使用ref或out關鍵字。ref和out這兩個關鍵字都能夠提供相似的功效,其作用也很像C中的指針變量。它們的區別是:
1、使用ref型參數時,傳入的參數必須先被初始化。對out而言,必須在方法中對其完成初始化。
2、使用ref和out時,在方法的參數和執行方法時,都要加Ref或Out關鍵字。以滿足配對條件。
3、out適合用在需要retrun多個回傳值的地方,而ref則用在需要被呼叫的方法修改呼叫者丟進的參數時。
註:在C#中,方法的參數傳遞有四種類型:
(1)傳值(by value)
(2)傳址(by reference)
(3)輸出參數(by output)
(4)數組參數(by array)。
(1)傳值參數無需額外的修飾符
(2)傳址參數需要修飾符ref
傳值參數在方法調用過 程中如果改變了參數的值,那麼傳入方法的參數在方法呼叫完成以後並不因此而改變,而是保留原來傳入時的值。
傳址參數恰恰相反,如果方法調用過程改變了參數 的值,那麼傳入方法的參數在調用完成以後也隨之改變。實際上從名稱上我們可以清楚地看出兩者的含義--傳值參數傳遞的是調用參數的一份拷貝,而傳址參數傳 遞的是調用參數的內存地址,該參數在方法內外指向的是同一個存儲位置。
方法參數上的 ref 方法參數關鍵字使方法引用傳遞到方法的同一個變數。當控制傳遞呼叫方法時,在方法中對參數所做的任何更改都將反映在該變數中。
若要使用 ref 參數,必須將參數作為 ref 參數顯式傳遞到方法。ref 參數的值被傳遞到 ref 參數。
傳遞到 ref 參數的參數必須最先初始化。將此方法與 out 參數相比,後者的參數在傳遞到 out 參數之前不必顯式初始化。屬性不是變數,不能作為 ref 參數傳遞。如果兩種方法的宣告只在它們對 ref 的使用方面不同,則將出現重載。但是,無法定義僅在 ref 和 out 方面不同的重載。
out方法參數上的 out 方法參數關鍵字使方法引用傳遞到方法的同一個變數。當控制傳遞迴調用方法時,在方法中對參數所做的任何更改都將反映在該變量中。
當希望方法返回多個值時,聲明 out 方法非常有用。使用 out 參數的方法仍然可以返回一個值。一個方法可以有一個以上的 out 參數。
若要使用 out 參數,必須將參數作為 out 參數顯式傳遞到方法。out 參數的值不會傳遞到 out 參數。不必初始化作為 out 參數傳遞的變數。然而,必須在方法返回之前為 out 參數賦值。
屬性不是變量,不能作為 out 參數傳遞。
網上有很多文章說ref 只傳值,out傳地址等等這種說法,好像不是非常的準確。以下是測試碼大家可以去試試:
總結一句,ref是有進有出,而out是只出不進。
1、使用ref型參數時,傳入的參數必須先被初始化。對out而言,必須在方法中對其完成初始化。
2、使用ref和out時,在方法的參數和執行方法時,都要加Ref或Out關鍵字。以滿足配對條件。
3、out適合用在需要retrun多個回傳值的地方,而ref則用在需要被呼叫的方法修改呼叫者丟進的參數時。
註:在C#中,方法的參數傳遞有四種類型:
(1)傳值(by value)
(2)傳址(by reference)
(3)輸出參數(by output)
(4)數組參數(by array)。
(1)傳值參數無需額外的修飾符
String _Value="xx"; FunctionByValue(_Value ); { }
(2)傳址參數需要修飾符ref
String _Value="xx"; FunctionByReferance(ref _Value ); public void FunctionByReferance( ref string Value) { }(3)輸出參數需要修飾符out
String _Value="xx"; FunctionByOutput(out _Value ); public void FunctionByOutput( out string Value) { }(4)數組參數需要修飾符params(有點像是模擬MAN的方式)
UseParams(100, 'a', "keywords"); public static void UseParams(params object[] list) { for (int i = 0; i < list.Length; i++) { Response.Write(list[i]); }
傳值參數在方法調用過 程中如果改變了參數的值,那麼傳入方法的參數在方法呼叫完成以後並不因此而改變,而是保留原來傳入時的值。
傳址參數恰恰相反,如果方法調用過程改變了參數 的值,那麼傳入方法的參數在調用完成以後也隨之改變。實際上從名稱上我們可以清楚地看出兩者的含義--傳值參數傳遞的是調用參數的一份拷貝,而傳址參數傳 遞的是調用參數的內存地址,該參數在方法內外指向的是同一個存儲位置。
方法參數上的 ref 方法參數關鍵字使方法引用傳遞到方法的同一個變數。當控制傳遞呼叫方法時,在方法中對參數所做的任何更改都將反映在該變數中。
若要使用 ref 參數,必須將參數作為 ref 參數顯式傳遞到方法。ref 參數的值被傳遞到 ref 參數。
傳遞到 ref 參數的參數必須最先初始化。將此方法與 out 參數相比,後者的參數在傳遞到 out 參數之前不必顯式初始化。屬性不是變數,不能作為 ref 參數傳遞。如果兩種方法的宣告只在它們對 ref 的使用方面不同,則將出現重載。但是,無法定義僅在 ref 和 out 方面不同的重載。
out方法參數上的 out 方法參數關鍵字使方法引用傳遞到方法的同一個變數。當控制傳遞迴調用方法時,在方法中對參數所做的任何更改都將反映在該變量中。
當希望方法返回多個值時,聲明 out 方法非常有用。使用 out 參數的方法仍然可以返回一個值。一個方法可以有一個以上的 out 參數。
若要使用 out 參數,必須將參數作為 out 參數顯式傳遞到方法。out 參數的值不會傳遞到 out 參數。不必初始化作為 out 參數傳遞的變數。然而,必須在方法返回之前為 out 參數賦值。
屬性不是變量,不能作為 out 參數傳遞。
網上有很多文章說ref 只傳值,out傳地址等等這種說法,好像不是非常的準確。以下是測試碼大家可以去試試:
public int RefValue(int i,ref int j) { int k = j; j =222; return i+k; } public int OutValue(int i, out int j) { j = 222; return i + j; } private void cmdRef_Click(object sender, EventArgs e) { int m = 0; MessageBox.Show(RefValue(1, ref m).ToString()); MessageBox.Show(m.ToString()); } private void cmdOut_Click(object sender, EventArgs e) { int m; MessageBox.Show(OutValue(1, out m).ToString()); MessageBox.Show(m.ToString()); }
總結一句,ref是有進有出,而out是只出不進。