1. 程式人生 > >C# Ref 與out 的區別

C# Ref 與out 的區別

在C#中,有四種傳遞引數方式:

1. 傳值 (value) : 無額外修飾符

2. 傳址(reference) : 需修飾符Ref,傳入函式的引數必須先賦值

3. 輸出引數(output): 需修飾符out,適用於return多個返回值,必須在方法中賦值

4.陣列引數 (array):需修飾符params

引用網上一段話:ref 是有進有出(進時需賦值,內部可以修改,並且修改後的值函式結束後仍將保留)

而out是隻出不進 (外部即便賦值,也不會傳入函式內,編譯器將提示該引數未被初始化,在函式內必須賦值,修改後和Ref引數一樣,其值將保留)

class Program
    {
        
static void Main(string[] args) { int m = 0;// ref 引數使用前必須初始化賦值 int k=100; // out 引數使用前不用初始化賦值,即便初始化,當使用out引用後,編譯器仍將認為其未初始化 MessageBox.Show(k.ToString()); //返回100 MessageBox.Show(RefValue(1, ref m).ToString());//返回1 MessageBox.Show(m.ToString());//
返回222 MessageBox.Show(OutValue(1, out k).ToString());//返回223 MessageBox.Show(k.ToString());//返回222 } private static int RefValue(int i, ref int j) { int k = j; j = 222; return i + k; } private static int
OutValue(int i, out int j) { //int k = j; //即便在外部定義了j=100 ,但任然無法使用,編譯器提示未初始化 j = 222; return i + j; } }

傳值引數在方法中如果改變了引數的值,其改變後的值只能在方法內使用,方法呼叫完成後引數只會保留原來傳入時的值。

通過以上測試,可以看到out 和ref 應用駿相當於傳遞指標,故其修改將直接修改原引數的值。

屬性不是變數,不能作為ref 和out引數傳遞,這裡記錄下來