カテゴリ: C# 更新日: 2026/01/17

C#のrefとoutキーワードとは?引数の参照渡しを理解しよう

C#のrefとoutキーワードとは?引数の参照渡しを理解しよう
C#のrefとoutキーワードとは?引数の参照渡しを理解しよう

先生と生徒の会話形式で理解しよう

生徒

「C#でメソッドに渡した変数の中身を変更することってできますか?」

先生

「いい質問ですね。C#ではrefoutというキーワードを使うと、引数を"参照渡し"で受け取って、呼び出し元の変数に直接影響を与えることができますよ。」

生徒

「えっ、普通はコピーされて渡されるんじゃないんですか?」

先生

「そうです、通常は"値渡し"なので元の変数には影響しません。でも、refoutを使えば、元の変数そのものを操作できるんです。詳しく見てみましょう!」

1. C#のrefとoutキーワードとは?

1. C#のrefとoutキーワードとは?
1. C#のrefとoutキーワードとは?

C#のrefとoutキーワードは、メソッドに渡した変数そのものを操作できるようにするための特別な仕組みです。通常の引数は「値渡し」と呼ばれ、値のコピーがメソッドに渡されるため、メソッド内で変更しても元の変数には影響しません。

しかし、refやoutを使うと「元の変数への参照」が渡されるため、メソッド内で値を書き換えれば、そのまま呼び出し元の変数に反映されます。まるで“同じ箱を共有して中身を入れ替える”ようなイメージです。

たとえば、次のような短いサンプルを見てみましょう。


void ChangeValue(ref int num)
{
    num = 50; // 元の変数を書き換える
}

int value = 10;
ChangeValue(ref value);
Console.WriteLine(value); // 50 と表示される

この例では、refを使っていることでメソッド内の変更が呼び出し元に反映されます。通常の値渡しでは起こらない動作なので、参照渡しの最初の特徴を理解するのに良い例です。

同じくoutキーワードも参照渡しですが、「値を必ずメソッド内でセットする」という点が特徴です。どちらもC#ではよく使われる重要な仕組みなので、まずは“元の変数を直接操作できる”という感覚からつかんでいきましょう。

2. refキーワードの使い方と特徴

2. refキーワードの使い方と特徴
2. refキーワードの使い方と特徴

refは「呼び出し元でも値が設定されている必要がある」キーワードです。つまり、refで渡す変数は、メソッドを呼び出す前に必ず初期化しておく必要があります。

以下はrefを使った基本的な例です。


void AddTen(ref int number)
{
    number += 10;
}

int x = 5;
AddTen(ref x);
Console.WriteLine(x); // 出力は15になる

実行結果:


15

このように、refを使うとメソッド内での変更が元の変数(この場合はx)に反映されます。

3. outキーワードの使い方と特徴

3. outキーワードの使い方と特徴
3. outキーワードの使い方と特徴

outは「呼び出し元では初期化しなくてよい」キーワードです。メソッドの中で必ず値を設定しなければなりません。

以下はoutを使ったサンプルです。


void SetValues(out int a, out int b)
{
    a = 100;
    b = 200;
}

int x, y;
SetValues(out x, out y);
Console.WriteLine($"x={x}, y={y}");

実行結果:


x=100, y=200

このように、outを使えば初期化していない変数でも、メソッド内で値をセットしてから使うことができます。

4. refとoutの違いを比較しよう

4. refとoutの違いを比較しよう
4. refとoutの違いを比較しよう

refとoutはよく似ていますが、明確な違いがあります。以下に表で整理してみましょう。

特徴 ref out
呼び出し前の初期化 必要 不要
メソッド内で値の設定 任意(しなくてもOK) 必須(設定しないとエラー)
目的 値を変更して戻す 値を返すための出力専用

5. refとoutを使う場面とは?

5. refとoutを使う場面とは?
5. refとoutを使う場面とは?

どちらのキーワードも、複数の値をメソッドから戻したいときや、メソッド内で変数の中身を変更したいときに便利です。

  • refは「現在の値を使い、その値を変更する」ような場合に適しています。
  • outは「メソッドから新しい値を返したい」場合に適しています。

例えば、文字列を数値に変換するint.TryParseメソッドでは、outキーワードが使われています。


string input = "123";
int number;
bool result = int.TryParse(input, out number);

if (result)
{
    Console.WriteLine($"変換成功!値は {number}");
}
else
{
    Console.WriteLine("変換に失敗しました。");
}

実行結果:


変換成功!値は 123

このように、outはとてもよく使われるキーワードで、C#の実用的なコードにも多く登場します。

6. 参照渡しのイメージを図でつかもう

6. 参照渡しのイメージを図でつかもう
6. 参照渡しのイメージを図でつかもう

初心者の方でもわかりやすいように、イメージ図で「値渡し」と「参照渡し」の違いを考えてみましょう。

  • 値渡し: コピーを渡す。元の箱は変わらない。
  • 参照渡し: 本物の箱を渡す。箱の中身を直接変える。

参照渡しでは、他の人が同じ箱を見ているので、誰かが中身を変えたらみんなに影響が出ます。

7. refとoutを使うときの注意点

7. refとoutを使うときの注意点
7. refとoutを使うときの注意点

便利なrefとoutですが、注意点もあります。

  • メソッドの使い方が複雑になるので、基本的には必要なときだけ使うようにしましょう。
  • 複数の戻り値が必要なときには便利ですが、クラスや構造体を使った設計の方がスマートな場合もあります。
  • メソッドの使い方が分かりづらくなるので、コメントや命名に注意して、わかりやすいコードを書くことが大切です。

まとめ

まとめ
まとめ

C#におけるrefoutキーワードは、メソッドと呼び出し元との間でデータの受け渡しを柔軟に行える仕組みとして、非常に重要な役割を担っています。これらは参照渡しを実現するための手段であり、通常の値渡しとは異なり、呼び出し元の変数の内容を直接変更したり、初期化されていない変数に値を代入することができます。

特にrefは「値を引き継いでそのまま変更」する場面に適しており、事前に初期化が必要です。一方でoutは「初期化されていない変数に値を代入して戻す」目的で使われるため、引数は初期化されていなくても構いませんが、必ずメソッド内で値をセットしなければならないという特徴があります。

例えば、以下のような例では、refを使って計算結果を直接返すような処理が可能です。


void MultiplyByTwo(ref int value)
{
    value *= 2;
}

int number = 8;
MultiplyByTwo(ref number);
Console.WriteLine($"結果は {number}"); // 結果は 16

また、outを使えば、複数の値を一度に返すこともできます。


void Calculate(out int area, out int perimeter, int width, int height)
{
    area = width * height;
    perimeter = 2 * (width + height);
}

int a, p;
Calculate(out a, out p, 4, 5);
Console.WriteLine($"面積: {a}, 周囲長: {p}"); // 面積: 20, 周囲長: 18

実務においても、たとえばTryParseのように、処理の成否と結果の両方を返す場面でoutが多用されます。これにより、エラー処理をしやすくなったり、余分な変数を用意せずにスマートなコードが書けるようになります。

ただし、使いすぎるとメソッドの見通しが悪くなることもあるため、refoutは「必要な場面で最小限に使う」という意識を持つことが重要です。複数の値を扱う場合は、クラスや構造体を使ったほうが可読性が高まることもあるため、設計の工夫も必要です。

C#の参照渡しの仕組みを正しく理解することで、より効率的で柔軟なコードを書くことができるようになります。「呼び出し元とメソッドの間でどのようにデータがやりとりされるか」を意識しながら、refとoutを使い分ける習慣を身につけましょう。

先生と生徒の振り返り会話

生徒

「refとoutの違い、最初は似てると思ったけど、ちゃんと整理したら使い分けがわかってきました!」

先生

「いい気づきですね。refは既に値が入ってる変数を変更したいとき、outは値を初めてセットするようなときに使います。」

生徒

「実際にコードで書いてみたら、値がちゃんと変わってて感動しました!でも、使いすぎには注意っていうのも納得です。」

先生

「そうなんです。便利だからといって何でもrefやoutに頼ると、後でメンテナンスしづらくなることもあるんですよ。」

生徒

「クラスや戻り値を工夫することも大事なんですね。TryParseの使い方も実践的で覚えておきたいです!」

先生

「その意識があれば、C#のコードはもっとスッキリしていきますよ。引数の渡し方は、小さなことに見えて実は設計の根幹ですからね。」

生徒

「ありがとうございました!次は戻り値の工夫とか、構造体を使った設計も学んでみたいです!」

先生

「素晴らしいですね!今日の理解を活かして、さらに一歩踏み込んだC#の世界へ進んでいきましょう。」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

C#でrefとoutの違いがいまいちわかりません。どう使い分ければいいですか?

C#のrefは呼び出す前に初期化された変数が必要で、メソッド内で変更された値を呼び出し元にも反映できます。一方、outは呼び出す前に初期化不要ですが、メソッド内で必ず値を設定しなければなりません。refは値を変更して返したいとき、outは新しい値を返したいときに使い分けましょう。
カテゴリの一覧へ
新着記事
New1
C#
C#のメモリ管理とガーベジコレクションの基礎を理解しよう
New2
C#
C#の参照型と値型の違いを初心者向けにやさしく解説!
New3
C#
C#のクエリ式とメソッド式の書き換え方を完全ガイド!LINQの2つの書き方をマスター
New4
C#
C#の戻り値にタプルを使う方法!複数の値を返すテクニック
人気記事
No.1
Java&Spring記事人気No1
C#
C#で文字列が数値か判定する方法を解説!char.IsDigitやTryParseの基本
No.2
Java&Spring記事人気No2
C#
C#のLINQでOrderByを使った並び替えを完全ガイド!初心者でもわかるソート方法
No.3
Java&Spring記事人気No3
C#
C#のrefとoutキーワードとは?引数の参照渡しを理解しよう
No.4
Java&Spring記事人気No4
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.5
Java&Spring記事人気No5
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.6
Java&Spring記事人気No6
C#
C#の引数と戻り値の基本!値を受け渡し・返す仕組みを理解しよう
No.7
Java&Spring記事人気No7
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説
No.8
Java&Spring記事人気No8
C#
C#のLINQでFirstとFirstOrDefaultの違いと使い方を完全解説!初心者向けガイド