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 の引数は、渡される前に明示的に初期化される必要はありません。詳細については、「out」を参照してください。
ref と out は、実行時の取り扱いは異なりますが、コンパイル時の取り扱いは同じです。そのため、2 つのメソッドのうち一方が ref 引数を受け取り、もう一方が out 引数を受け取る場合、これらのメソッドはオーバーロードできません。これら 2 つのメソッドは、たとえば、コンパイルの観点からは同じメソッドになるので、次のコードはコンパイルされません。
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 も役立ちます。この方法では、参照自体が参照渡しされるため、呼び出されたメソッドは、参照が参照しているオブジェクトを変更できます。次の例は、参照型を 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 参照パラメータ