相同點:方法的定義和呼叫都必須顯示使用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是只出不進。需求假...