ref (C# リファレンス)
ref キーワードを使用すると、引数が参照渡しされます。 その結果、メソッドでパラメーターに加えられた変更は、制御が呼び出し元のメソッドに戻された時点で変数に反映されます。
注意
参照渡しの概念と参照型の概念とを混同しないでください。 これら 2 つの概念は同じではありません。 メソッド パラメーターは、値型であるか参照型であるかにかかわらず、ref で修飾できます。 値型が参照渡しにされるときには、ボックス化が行われません。
ref パラメーターを使用するには、メソッド定義と呼び出し元のメソッドの両方で ref キーワードを明示的に使用する必要があります。 次に例を示します。
class RefExample
{
static void Method(ref int i)
{
// Rest the mouse pointer over i to verify that it is an int.
// The following statement would cause a compiler error if i
// were boxed as an object.
i = i + 44;
}
static void Main()
{
int val = 1;
Method(ref val);
Console.WriteLine(val);
// Output: 45
}
}
ref パラメーターに渡される引数は、事前に初期化されている必要があります。 これは out とは異なります。out の引数は、渡される前に明示的に初期化される必要はありません。 詳細については、「out」を参照してください。
ref キーワードと out キーワードでは、実行時の動作は異なりますが、コンパイル時にはメソッド シグネチャの一部と見なされません。 そのため、2 つのメソッドのうち一方が 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 RefOverloadExample
{
public void SampleMethod(int i) { }
public void SampleMethod(ref int i) { }
}
プロパティは変数ではありません。 実際にはメソッドであるため、ref パラメーターとして渡すことができません。
配列を渡す方法の詳細については、「ref と out を使用した配列の引き渡し (C# プログラミング ガイド)」を参照してください。
使用例
値型の参照渡しは、このトピックで既に説明したように便利ですが、参照型を渡す場合は ref も役立ちます。 この方法では、参照自体が参照渡しされるため、呼び出されたメソッドは、参照が参照しているオブジェクトを変更できます。 次の例は、参照型を ref パラメーターとして渡すときにオブジェクト自体を変更できることを示します。 詳細については、「参照型のパラメーターの引き渡し (C# プログラミング ガイド)」を参照してください。
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# 言語仕様」を参照してください。 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。