關於C 中的ref和out引數的說明

2021-04-13 11:16:29 字數 1870 閱讀 9256

看下面的例子:

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 中的 Out 和 Ref 引數

out和ref引數 經常用來通過方法傳遞引數來獲取值,當您的方法不只有乙個返回值的時候,這兩個引數就發揮作用了。ref是傳遞引數的位址,out是返回值,兩者有一定的相同之處,不過也有不同點。在這篇文章裡,我將解釋如何在c 應用中使用這兩個引數。1 out 引數 out方法引數關鍵字使方法引用傳遞到方...

C 的out引數和ref引數

剛學c 的時候看過out引數和ref引數的用法,但是一直沒有根據實際專案做過。今天寫webservice介面的時候用到了 本來我是寫乙個方法查詢乙個資料庫,返回乙個dataset給別人呼叫,沒問題,完成了 我的上篇部落格寫有 但是專案總是變化 的,有人要求同時將dataset的總記錄條數也返回給他們...

C 中的ref和out型別引數

clr via c 上說 clr不區分out和ref,無論使用哪個關鍵字都會產生相同的il 另外元資料也完全一致,只有乙個bit除外,這個bit是用來記錄該引數屬於out還是ref的。ref型別的引數 如果方法的引數用ref標記,呼叫者必須在呼叫該方法前初始化這個引數的值,被呼叫的方法可以讀取值以及...