C ref與out之間的區別

2021-08-28 07:17:18 字數 1907 閱讀 5209

相同點:方法的定義和呼叫都必須顯示使用ref、out關鍵字。都會導致引數按引用傳遞。

不同點:傳遞給ref關鍵字的引數必須賦初始值,而out不用。out關鍵字會清空變數,即使變數已經賦值也不行,退出函式時所有out引用個變數都要賦值。

說明:ref的應用場景是內部對外部的值進行改變,而out則是內部對外部變數賦值。out一般用在函式有多個返回值。

using system;

using system.collections.generic;

using system.linq;

using system.text;

namespace aaa

}public class a

public void gettest(out int i)

}}

ref和out都是c#中的關鍵字,所實現的功能也差不多,都是指定乙個引數按照引用傳遞。

對於編譯後的程式而言,它們之間沒有任何區別,也就是說它們只有語法區別。

總結起來,他們有如下語法區別:

1、ref傳進去的引數必須在呼叫前初始化,out不必,即:

int i;

somemethod( ref i );//語法錯誤

somemethod( out i );//通過

2、ref傳進去的引數在函式內部可以直接使用,而out不可:

public void somemethod(ref int i)

public void somemethod(out int i)

public void samplemethod(out int i)

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

class refoutoverloadexample

public void samplemethod(int i)

public void samplemethod(ref int i)

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

例如:class outexample

static void method(out int i)

i = 44;

static void main()

int value;

method(out value);

// value is now 44

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

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

class cs0663_example

// compiler error cs0663: "cannot define overloaded

// methods that differ only on ref and out".

public void samplemethod(out int i)

public void samplemethod(ref int i)

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

class refoutoverloadexample

public void samplemethod(int i)

public void samplemethod(out int i)

c ref與out的區別

c ref與out的區別 相同點 都是輸出引數 不同點 ref 1 必須初始化,即 必須賦初始值 2.有進有出 3 用在需要被呼叫的方法修改呼叫者的引用的時候。4 是傳遞引數的位址 out 1.不需要初始化,即 不需要賦初始值 2 只出不進 3 用在需要retrun多個返回值的地方 4 返回值 通過...

C Ref 與out 的區別

在c 中,有四種傳遞引數方式 1.傳值 value 無額外修飾符 2.傳址 reference 需修飾符ref,傳入函式的引數必須先賦值 3.輸出引數 output 需修飾符out,適用於return多個返回值,必須在方法中賦值 4.陣列引數 array 需修飾符params 而out是只出不進 外...

C ref和out的區別

首先 兩者都是按位址傳遞的,使用後都將改變原來引數的數值。其次 ref可以把引數的數值傳遞進函式,但是out是要把引數清空,就是說你無法把乙個數值從out傳遞進去的,out進去後,引數的數值為空,所以你必須初始化一次。這個就是兩個的區別,或者說就像有的說的,ref是有進有出,out是只出不進。需求假...