refとout

C#のメソッドは通常、Javaと同じで値渡し、もしくは参照の値渡しだけど、refやらoutやらつけることで参照渡しもできる。


まずはrefから。

static void Method(ref int i)
{
    if (i < 0) i = 0;
}

で、呼び出し側はrefをつけて呼び出す。

int data = -10;
Method(ref data);
Console.WriteLine(data.ToString());

このときに、未割り当ての変数を渡すとコンパイルエラーになる。


次にoutだが、

static void Method(out int i)
{
    i = 0;
}

と、一見refをoutにしただけだが、outはメソッドから抜け出す前に割り当てられないとコンパイルエラーとなるので、

static void Method(out int i)
{
    if (i < 0) i = 0;
}

これはエラーになる。
しかし、refとは違い、

int data;
Method(out data);
Console.WriteLine(data.ToString());

このよに未割り当ての変数を渡すこともできる。


まとめると、

メソッド内 呼び出し側
ref 代入しなくてもOK 未割り当ての変数を渡すとエラー
out 必ず代入が必要 未割り当ての変数でも渡せる


ま、引数が1つ、戻り値もなしなメソッドだったら

static int Method(int i)
{
    return i < 0 ? 0 : i;
}

でいいんだけど、複数の戻り値が欲しいときにはこれが使える。
Javaでは参照渡しはできないから、やろうと思ったら配列とかを使ったり、戻り値用のクラスを作ったりすることになるだろう。