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では参照渡しはできないから、やろうと思ったら配列とかを使ったり、戻り値用のクラスを作ったりすることになるだろう。