メソッドに値を引数で渡す場合、値渡しと参照渡しというものがあります。
メソッド内で処理した結果を処理後に必要な場合には参照渡しにする必要があるのですが、まずはコード例から。
static void Main(string[] args)
{
int a1;
int a2;
int a3;
a1 = 1; // 値を代入しておく必要がある
Method1(a1); // 処理後:a = 1
a2 = 1; // 値を代入しておく必要がある
Method2(ref a2); // 処理後:a = 11
//a3 = 1; // 値を代入しておく必要がない(意味がない)
Method3(out a3); // 処理後:a = 10
}
// 値渡し
public static void Method1(int a)
{
a += 10; // メソッド内では a = 11 となる
}
// 参照渡し(ref)
public static void Method2(ref int a)
{
a += 10;
}
// 参照渡し(out)
public static void Method3(out int a)
{
//a += 10; // エラー:未割り当てのoutパラメータ'a'が使用されました。
a = 10;
}
Method1は値渡しの例ですが、aの値はメソッドで受け取れるものの、処理後のaは処理前のaの値と同じままです。
Method2は参照渡し(ref)の例ですが、aの値はメソッドで受け取れ、処理後のaもメソッド内で処理した値が繁栄されます。
参照渡し(ref)で渡す引数はメソッドに渡す前に必ず初期化(値を代入)しておく必要があります。
Method3は参照渡し(out)の例ですが、aの値を受け取れないものの、処理後の値はメソッド内で処理した値となります。
参照渡し(out)で渡す引数はメソッドに渡す前に初期化しておく必要はありません。
これらの動きは私のイメージではこんな感じ↓なのですが、伝わるでしょうか?
使い分け的には、一般的な処理では値渡しで十分な場合が多いかと思いますが、処理した結果が必要な場合には参照渡しとなります。
refとoutの違いについては、refでは引数の初期化が必要になりますが、outではその必要がありません。
そのため、メソッド内で引数で渡された値が必要な場合には、ref、必要の無い場合にはoutを使うとよいかと思います。
←C#へ戻る