ref (C# 參考)
更新:2007 年 11 月
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,其引數並不需要在傳遞之前先明確初始化。如需詳細資訊,請參閱 out。
雖然 ref 和 out 在執行階段被視為不同,但在編譯時期卻被視為相同。因此,若其中一個方法使用 ref 引數,而另一個方法使用 out 引數,就不能多載方法。例如,這兩個方法就編譯 (Compilation) 而言是相同的,因此這段程式碼將不會編譯:
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 RefOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(ref int i) { }
}
屬性不是變數,所以不能做為 ref 參數傳遞。
如需如何傳遞陣列的詳細資訊,請參閱使用 ref 和 out 傳遞陣列 (C# 程式設計手冊)。
範例
如本主題前述內容所示範,以傳址方式傳遞型別是很有用的,而且 ref 對於剖析參考型別 (Reference Type) 也非常有用。這可讓被呼叫的方法修改參考所參照的物件,因為參考本身是以傳址方式傳遞。下列範例示範當參考型別是當做 ref 參數傳遞時,物件可以自行變更。
class RefExample2
{
static void Method(ref string s)
{
s = "changed";
}
static void Main()
{
string str = "original";
Method(ref str);
Console.WriteLine(str);
}
}
// Output: changed
C# 語言規格
如需詳細資料,請參閱 C# 語言規格中的下列章節:
5.1.5 參考參數
10.6.1.2 參考參數