本文へスキップ
BecomeCoder

C#文法コース · 第4章 メソッド · レッスン32

ref と out

ブラウザで完結

導入

通常、引数は値のコピーが渡されます。しかし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です。

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

C# — ブラウザ内で実行

ブラウザ内でC#を動かす環境を読み込みます(初回のみ数秒)。
スクロールして表示された時点でも自動で読み込まれます。