C#中的ref,out區別,理論總結和程式碼例項(夯實基礎)
技術標籤:c#
本質是將按地址傳遞,都將改變原來的值,ref把引數值傳進來,可以做它用,修改再傳出來,強調的是修改一個值,而out則不能傳入引數的值,因為它會清空引數的值,因此也不需要初始化,強調返回輸出一個值,
涉及ref宣告的引數方法,方法呼叫前傳入引數的變數初始化,ref更多用於被呼叫者修改呼叫方,out則是返回多個值,因為可以寫多個out引數,無論是out或是ref在宣告方法中,還是呼叫方法中都是需要對應關鍵字,且不能同時過載
ref(C#參考)
ref關鍵字使引數按引用傳遞。其效果是,當控制權傳遞迴呼叫方法時,在方法中對引數的任何更改都將反映在該變數中。若要使用ref引數,則方法定義和呼叫方法都必須顯式使用ref關鍵字。
例如:
class RefExample
{
static void Method(ref int i)
{
i = 44;
}
static void Main()
{
int val = 0;
Method(ref val);
// val is now 44
}
}
傳遞到ref引數的引數必須最先初始化。這與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(ref int i) { }
public void SampleMethod(out int i) { }
}
但是,如果一個方法採用ref或out引數,而另一個方法不採用這兩個引數,則可以進行過載,如下例所示:
class RefOutOverloadExample { public void SampleMethod(int i) { } public void SampleMethod(ref int i) { } }
out(C#參考)
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) { }
}
為了偷懶主要參考如下: