導入
通常、引数は値のコピーが渡されます。しかしref(参照渡し)やout(出力用)を使うと、メソッドの中から呼び出し側の変数そのものを変更できます。特にoutは「複数の値を返す」ときに実務で頻出します。
図解
flowchart LR
subgraph 通常
V1["x=5"] -->|コピーを渡す| M1["メソッド内で変更しても<br/>元の x は不変"]
end
subgraph out
M2["メソッドが結果を書き込む"] -->|変数そのものへ| V2["呼び出し側の変数に反映"]
end
サンプル
// out: メソッドから複数の結果を「書き出す」
Divide(17, 5, out int quotient, out int remainder);
Console.WriteLine($"商{quotient} 余り{remainder}"); // 商3 余り2
void Divide(int a, int b, out int q, out int r)
{
q = a / b; // out 引数はメソッド内で必ず代入する
r = a % b;
}
// ref: 呼び出し側の変数を直接書き換える
int value = 10;
Double(ref value);
Console.WriteLine(value); // 20
void Double(ref int n)
{
n = n * 2;
}
out: メソッドが結果を書き出すための引数。int.TryParseでも使われる形。メソッド内で必ず代入するref: 呼び出し側の変数を参照で渡し、直接書き換える- どちらも呼び出し時にも
out/refキーワードを付ける
演習
// TODO: 配列の最小値と最大値を out で返す MinMax メソッドを定義し、
// { 3, 1, 4, 1, 5 } に対して "最小1 最大5" と出力してください
int[] data = { 3, 1, 4, 1, 5 };
___
- 期待される出力:
最小1 最大5
ヒント1を見る
void MinMax(int[] a, out int min, out int max) { min = a.Min(); max = a.Max(); }(LINQのMin/Maxが使えます)
ヒント2を見る
MinMax(data, out int mn, out int mx); Console.WriteLine($"最小{mn} 最大{mx}"); void MinMax(int[] a, out int min, out int max) { min = a.Min(); max = a.Max(); }
まとめ
outはメソッドから複数の値を返すのに使う(TryParseが代表例)refは呼び出し側の変数を直接書き換える- 呼び出し時にもキーワードを付ける
次回: 引数の個数を自由にするparamsです。