C 語言參考 ref和out

2021-04-26 01:23:23 字數 2067 閱讀 6435

ref關鍵字使引數按引用傳遞。其效果是,當控制權傳遞**用方法時,在方法中對引數所做的任何更改都將反映在該變數中。若要使用ref引數,則方法定義和呼叫方法都必須顯式使用ref關鍵字。例如:

class refexample

static void main()

}

傳遞到ref引數的引數必須最先初始化。這與 out 不同,out 的引數在傳遞之前不需要顯式初始化。
儘管refout在執行時的處理方式不同,但它們在編譯時的處理方式是相同的。因此,如果乙個方法採用ref引數,而另乙個方法採用 out引數,則無法過載這兩個方法。例如,從編譯的角度來看,以下**中的兩個方法是完全相同的,因此將不會編譯以下**:
class zzh_example 

public void samplemethod(out int i)

}

但是,如果乙個方法採用ref或 out引數,而另乙個方法不採用這兩類引數,則可以進行過載,如下所示:
class refoutoverloadexample

public void samplemethod(ref int i)

}

按引用傳遞值型別(如上所示)是有用的,但是ref對於傳遞引用型別也是很有用的。這允許被呼叫的方法修改該引用所引用的物件,因為引用本身是按引用來傳遞的。下面的示例顯示出當引用型別作為ref引數傳遞時,可以更改物件本身。

class refrefexample

static void main()

}

out關鍵字會導致引數通過引用來傳遞。這與ref 關鍵字類似,不同之處在於ref要求變數必須在傳遞之前進行初始化。若要使用out引數,方法定義和呼叫方法都必須顯式使用out關鍵字。例如:

class outexample

static void main()

}

儘管作為out引數傳遞的變數不需要在傳遞之前進行初始化,但需要呼叫方法以便在方法返回之前賦值。

refout關鍵字在執行時的處理方式不同,但在編譯時的處理方式相同。因此,如果乙個方法採用ref引數,而另乙個方法採用out引數,則無法過載這兩個方法。例如,從編譯的角度來看,以下**中的兩個方法是完全相同的,因此將不會編譯以下**:

class zzh_example

public void samplemethod(ref int i)

}

但是,如果乙個方法採用refout引數,而另乙個方法不採用這兩類引數,則可以進行過載,如下所示:
class refoutoverloadexample

public void samplemethod(out int i)

}

當希望方法返回多個值時,宣告out方法很有用。使用out引數的方法仍然可以將變數用作返回型別,但它還可以將乙個或多個物件作為out引數返回給呼叫方法。此示例使用out在乙個方法呼叫中返回三個變數。請注意,第三個引數所賦的值為 null。這樣便允許方法有選擇地返回值。

class outreturnexample

static void main()

}

注:屬性不是變數,因此不能作為refout的引數傳遞。

本篇部分資料定義來自msdn。

C 基礎 ref 和 out 區別

ref和out的區別在c 中,既可以通過值也可以通過引用傳遞引數。通過引用傳遞引數允許函式成員更改引數的值,並保持該更改。若要通過引用傳遞引數,可使用ref或out關鍵字。ref和out這兩個關鍵字都能夠提供相似的功效,其作用也很像c中的指標變數。它們的區別是 1 使用ref型引數時,傳入的引數必須...

ref和out 傳遞引數 C

1.引數傳遞預設都是傳遞棧空間裡面儲存的內容 2.如果新增了ref那麼傳遞的都是棧空間位址,而不再是棧空間裡面的內容 3.如果新增了out,那麼傳遞的也是棧空間的位址 1 寫乙個方法計算乙個int型別陣列中每個元素的總和以及最大值和最小值 2 3 4 5 6 7static void gatvalu...

C 中使用ref和out詳解

摘 要 傳值引數傳遞的是呼叫引數的乙份拷貝,而傳址引數傳遞的是呼叫引數的記憶體位址,該引數在方法內外指向的是同乙個儲存位置。首先,如果不使用這兩個關鍵字,那是什麼樣 呢?看下面的例子 using system class test static void swap int x,int y stati...