C 方法中引數ref和out的解析

2022-01-23 08:20:45 字數 3330 閱讀 2472

一、c#方法中引數型別

有4種引數型別,有時候很難記住它們的不同特徵,下圖對它們做乙個總結,使之更容易比較和對照。

二、c#方法中的引數

1、值引數

使用值引數,通過複製實參的值到形參的方式把資料傳遞到方法。方法呼叫時,系統做如下操作:

· 在棧中為形參分配空間 

· 複製實參到形參

注:棧(先進後出)是編譯期間就分配好的記憶體空間,因此你的**中必須就棧的大小有明確的定義;

堆(佇列優先,先進先出)是程式執行期間動態分配的記憶體空間,你可以根據程式的運**況確定要分配的堆記憶體的大小。

///

///宣告方法

//////

引數///

返回值static

float funcdata(float

value )

2、引用引數· 使用引用引數時,必須在方法的宣告和呼叫中都使用ref修飾符

· 實參必須是變數,在用作實參前必須被賦值,如果是引用型別變數,可以賦值為乙個引用或者null值

///

///宣告方法

//////

引數///

返回值static

void funcdata(float

value )

//////

方法宣告

//////

引數///

返回值static

int funcdata(ref

intvalue)

3、輸出引數· 必須在宣告和呼叫中都使用修飾符。輸出引數的修飾符是out不是ref

· 和引用引數相似,實參必須是變數,而不能是其他型別的表示式。(因為方法需要記憶體位置儲存返回值)

///

///宣告方法

//////

引數///

返回值static

void funcdata(float

value )

//////

方法宣告

//////

引數///

返回值static

int funcdata(out

intvalue)

與引用引數不同,輸出引數有以下要求:· 在方法內部,輸出引數在被讀取之前必須被賦值。(意味著引數的初始值是無關的,而且沒有必要在方法呼叫之前為實參賦值)

· 在方法返回之前,方法內部的任何貫穿的可能路徑都必須為所有輸出引數進行一次賦值。

class

myclass

class

program

//////

方法呼叫

/// static

void

main()

static

void functest(out

intvalue)

}

4、引數陣列·在乙個引數列表中只能有乙個引數陣列

·如果有,它必須是列表中的最後乙個

宣告乙個引數陣列必須做的事

·在資料型別前使用params修飾符

·在資料型別後放置一組空的方括號

///

///宣告方法

//////

引數static

void functest(params

int array)

· 陣列是一組整齊的相同型別的資料項

· 陣列使用乙個數字索引進行訪問

· 陣列是乙個引用型別,因此它的所有資料項都儲存在堆中

三、c#中方法引數ref和out區別

1、使用ref型引數時,傳入的引數必須先被初始化。對out而言,必須在方法中對其完成初始化

2、使用ref和out時,在方法的引數和執行方法時,都要加ref或out關鍵字,以滿足匹配。

3、out適合用在需要retrun多個返回值的地方,而ref則用在需要被呼叫的方法修改呼叫者的引用的時候。

class

static

void reftest(ref

int x, ref

inty)

public

static

void

main()

;b=", a, b);

//在使用out關鍵字時,不需要在此處初始化,初始化也不會影響到方法內部的值,所以你初始化沒用

int c = 11, d = 22

; outtest(

out c, out

d); console.writeline(

"c=;d=

", c, d);

//錯誤 (ref test)

intm, n;

reftest(

ref m, ref

n);

//上面行錯ref使用前變數必須賦值

//正確(ref test)

int o = 11, p = 22

; reftest(

ref o, ref

p); console.writeline(

"o=;p=

", o, p);}}

四、總結1、ref的使用:使用ref進行引數的傳遞時,該引數在建立時,必須設定其初始值,且ref側重於修改;

2、out的使用:採用out引數傳遞時,該引數在建立時,可以不設定初始值,但是在方法中必須初始化,out側重於輸出;

注釋:當希望方法返回多個值時,可以用out,並且乙個方法中的引數可以有乙個或多個out引數;使用out引數,必須將引數作為out參數顯式傳遞到方法中,但是out 引數的值不會被傳遞到 方法中,且屬性不是變數,不能作為 out 引數傳遞。

ref是有進有出,而out是只出不進。

C 中的 Out 和 Ref 引數

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

c 方法引數ref和out區別

c 方法引數ref和out區別 params 關鍵字可以指定採用數目可變的引數的 方法引數。可以傳送引數宣告中所指定型別的逗號分隔的引數列表或指定型別的引數陣列。還可以不傳送引數。在方法宣告中的 params 關鍵字之後不允許任何其他引數,並且在方法宣告中只允許乙個 params 關鍵字。class...

C 方法的out引數和ref引數詳解

當乙個方法有多個返回值且是不同型別時,我們可以利用方法的引數 out引數和ref引數。我們先來看看最簡單的引數傳遞 static void main string args public static intadd int a,int b 一看就知道返回結果是10,20,30 那麼再來看看方法的re...