1. 程式人生 > 實用技巧 >c# 入門 ref out

c# 入門 ref out

ref:引用引數 變數作為引數傳給方法,同時希望在方法執行完成後,對引數所做的修改能夠反映到變數上(個人對這句話的理解為:拿到一個變數在使用後得到另一個變數 並且想保留這個使用後的變數) 首先:在控制檯上寫一個方法,方法的功能就是交換傳入的數值,程式碼如下
static void TestRef(int x, int y)
{
    int temp;
    temp = y;
    y = x;
    x = temp;
}
然後:在 Main 函式裡宣告兩個 int 型別的變數 x,y,然後呼叫 TestRef 方法。為做直觀的對比,這裡我把交換 x,y 前和交換 x,y後都在控制檯上打印出來,程式碼如下

static void Main(string[] args)
{
    int x = 10;
    int y = 20;
    Console.WriteLine("交換前:x={0},y={1}", x, y);
    TestRef(x, y);
    Console.WriteLine(
"交換後:x={0},y={1}", x, y); Console.ReadKey(); }
啟動專案,結果如下 為什麼呼叫TestRef方法之後 x和y的值並沒有交換? 原因分析 首先,函式本身沒有問題,問題在於 int 是值型別,它所建立的例項不在託管堆中分配記憶體,而是直接儲存在變數中。雖然我們呼叫了函式 TestRef,但也不過只是複製了一遍 x,y 的值而已。那我們想在呼叫完交換函式 TestRef 後,x,y的位置可以交換,該怎麼做呢? 這就要引入關鍵字 ref 什麼是 ref ref (全拼:reference):強制要求引數按引用傳值。 使用 ref 關鍵字 有兩個注意事項,如下 一:傳入引數之前,必須給引數賦值。 二:呼叫方法時,必須加 ref 關鍵字。 三:函式可能會改變引用引數的值,所以必須在函式呼叫中使用“非常量”變數 四:必須使用初始化過的變數。C#不允許假定ref引數在使用他的函式中初始化。 out(輸出引數) 使用out關鍵字後改引數的值將返回給函式呼叫中使用的變數(在執行函式時使用了一個變數A在執行完函式後得到一個B並且我們用B的值替換掉A的值。) 1.傳方法到引數之前,可以不用先賦值。 2.在函式使用out引數時,必須把它看成尚未賦值,在方法內部,必須要有給引數賦值的語句。 結果 即使在呼叫方法之前,為變數賦值,呼叫方法之後,還是會更改變數的值,所以沒有必要在方法呼叫之前為實參賦值。 接下來該看一下 ref和out之間的區別了 使用 ref 引數時,傳入的引數必須先被初始化。對 out 引數而言,必須在方法中對其完成初始化。 2、使用 ref 和 out 時,在方法的引數和執行方法時,都要加 ref 或 out 關鍵字,以滿足匹配。 3、out 適合用在需要 return 多個返回值的地方,而 ref 則用在需要被呼叫的方法,修改呼叫者的引用的時候。 什麼時候選擇用 ref ? 什麼時候選擇用 out ? 1、ref 的使用:使用 ref 進行引數的傳遞時,該引數在建立時,必須設定其初始值,所以ref 側重於修改; 2、out 的使用:採用 out 引數傳遞時,該引數在建立時,可以不設定初始值,但是在方法中必須初始化,所以 out 側重於輸出; 當希望方法返回多個值時,可以用 out,並且一個方法中的引數可以有一個或多個 out 引數; 使用 out 引數,必須將引數作為 out 引數顯式傳遞到方法中,但是out 引數的值不會被傳遞到方法中,且屬性不是變數,不能作為 out 引數傳遞。 簡單來說:ref 是有進有出,而 out 是隻出不進。