首先,如果不使用這兩個關鍵字,那是什麼樣 呢?
看下面的例子:
using system;
class test
static void swap(int x,int y)
static void main()
, j = ", i, j);
swap(i,j);
console.writeline("i = , j = ", i, j);
} }
程式經編譯後執行輸出:
i = 2, j = 1
i = 2, j = 1
這是csdn的一篇帖子上的例子.其實如果放在一起,並不能很容易的看出使用ref和不使用ref的區別.
分開看,就很明顯了.
使用ref:
using system;
class test
static void main()
, j = ", i, j);
} }
程式經編譯後執行輸出:
i = 2, j = 1
不使用:
using system;
class test
static void main()
, j = ", i, j);
} }
程式經編譯後執行輸出:
i = 1, j = 2;
比較這兩個裡子很明顯,使用了ref關鍵字的函式呼叫以後,i和j的值變化了.而沒有使用ref的卻沒有變,為什麼呢?
請看下面這段話:
方法的引數是個值得特別注意的地方。方法的引數傳遞有四種型別:傳值(by value),傳址(by reference),輸出引數(by output),陣列引數(by array)。傳值引數無需額外的修飾符,傳址引數需要修飾符ref,輸出引數需要修飾符out,陣列引數需要修飾符params。傳值引數在方法呼叫過程中如果改變了引數的值,那麼傳入方法的引數在方法呼叫完成以後並不因此而改變,而是保留原來傳入時的值。傳址引數恰恰相反,如果方法呼叫過程改變了引數的值,那麼傳入方法的引數在呼叫完成以後也隨之改變。實際上從名稱上我們可以清楚地看出兩者的含義--傳值引數傳遞的是呼叫引數的乙份拷貝,而傳址引數傳遞的是呼叫引數的記憶體位址,該引數在方法內外指向的是同乙個儲存位置。
所以我們可以看出,平時我們寫的函式引數是傳值引數(傳值引數無需額外的修飾符),不論他是值型別還是引用型別.你可以試這個例子(這個例子是對"不論他是值型別還是引用型別"這句話,):
using system;
class test
static void main()
, j = ", i, j);
} }
程式經編譯後執行輸出:
i = "1", j = "2";
注意:string型別是引用型別.
i,j的值並沒有改變,說明引用型別作為函式引數時,只要不加ref或者out,那他仍然是傳值引數(我一直以為值型別作為函式引數時是傳值引數,而引用型別作為函式引數時是傳址引數).
.net框架程式設計(修訂版)上有這樣一句話:ref和out的區別是引數的初始化和引數返回,
可是這裡說out是輸出引數,那加out是傳址引數嗎?要不,怎麼也會變呢(應該也是吧,可能他只是乙個名字,可以理解成輸出引數也是傳址引數)?
using system;
class test
static void main()
, j = ", i, j);
} }
程式經編譯後執行輸出:
i = 2, j = 1
總結:傳值引數傳遞的是呼叫引數的乙份拷貝,而傳址引數傳遞的是呼叫引數的記憶體位址,該引數在方法內外指向的是同乙個儲存位置.
這句話可以這樣說更加明白:傳值引數傳遞的是呼叫引數的拷貝的位址,該引數在方法內外指向的不是是同乙個儲存位置,而傳址引數傳遞的是呼叫引數的記憶體位址,該引數在方法內外指向的是同乙個儲存位置,
理解這句話,自然明白為什麼會變化或者為什麼不變化.
以上是個人的一點理解,肯定有不妥之處,請批評指出.
C 中使用ref和out一點認識
ref 通常我們向方法中傳遞的是值.方法獲得的是這些值的乙個拷貝,然後使用這些拷貝,當方法執行完畢後,這些拷貝將被丟棄,而原來的值不將受到影響.此外我們還有其他向方法傳遞引數的形式,引用 ref 和輸出 out 有時,我們需要改變原來變數中的值,這時,我們可以向方法傳遞變數的引用,而不是變數的值.引...
使用ref和out一點認識
ref 通常我們向方法中傳遞的是值.方法獲得的是這些值的乙個拷貝,然後使用這些拷貝,當方法執行完畢後,這些拷貝將被丟棄,而原來的值不將受到影響.此外我們還有其他向方法傳遞引數的形式,引用 ref 和輸出 out 有時,我們需要改變原來變數中的值,這時,我們可以向方法傳遞變數的引用,而不是變數的值.引...
C 中使用ref和out詳解
摘 要 傳值引數傳遞的是呼叫引數的乙份拷貝,而傳址引數傳遞的是呼叫引數的記憶體位址,該引數在方法內外指向的是同乙個儲存位置。首先,如果不使用這兩個關鍵字,那是什麼樣 呢?看下面的例子 using system class test static void swap int x,int y stati...