C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のrefパラメーターとoutパラメーターの違いとは?使い分けのポイントを解説

C#には、メソッドに引数を渡す際に変数そのものへの参照を渡すための仕組みとして、「refパラメーター」と「outパラメーター」の2種類が用意されています。どちらも呼び出し元の変数の値をメソッド内から直接操作できる点は共通していますが、初期化の要否や代入のルール、想定される用途に違いがあります。本記事では、サンプルコードを交えながら、両者の違いをわかりやすく解説します。

refパラメーター(参照パラメーター)とは

refパラメーターは、変数のメモリ上の場所(参照)をそのまま渡す仕組みです。通常の値渡しとは異なり、新しいストレージ領域は作成されません。そのため、メソッド内で行った変更が、そのまま呼び出し元の変数に反映されます。

refパラメーターを宣言するには、キーワード「ref」を使用します。なお、refで渡す変数は、メソッドを呼び出す前に必ず初期化しておく必要がある点に注意してください。

サンプルコード:2つの値を入れ替えるswap処理

using System;

namespace CalculatorApplication {
    class NumberManipulator {
        public void swap(ref int x, ref int y) {
            int temp;

            temp = x; /* xの値を保存 */
            x = y;    /* yの値をxへ代入 */
            y = temp; /* 保存しておいた値をyへ代入 */
        }

        static void Main(string[] args) {
            NumberManipulator n = new NumberManipulator();

            /* ローカル変数の定義 */
            int a = 100;
            int b = 200;

            Console.WriteLine("Before swap, value of a : {0}", a);
            Console.WriteLine("Before swap, value of b : {0}", b);

            /* 値を入れ替えるメソッドを呼び出し */
            n.swap(ref a, ref b);

            Console.WriteLine("After swap, value of a : {0}", a);
            Console.WriteLine("After swap, value of b : {0}", b);

            Console.ReadLine();
        }
    }
}

実行結果

Before swap, value of a : 100
Before swap, value of b : 200
After swap, value of a : 200
After swap, value of b : 100

このように、swapメソッド内で入れ替えた値が、呼び出し元の変数aとbにも反映されていることが確認できます。

outパラメーターとは

C#では、returnステートメントで返せる戻り値は原則1つだけです。しかし、outパラメーターを使えば、実質的に複数の値をメソッドから返すことが可能になります。

outパラメーターの最大の特徴は、呼び出し元で変数を事前に初期化しなくてよいという点です。メソッド側で必ず値を代入する前提のため、未初期化の変数をそのまま渡せます。

サンプルコード:outパラメーターで値を取得する

using System;

namespace CalculatorApplication {
    class NumberManipulator {
        public void getValue(out int x) {
            int temp = 10;
            x = temp;
        }

        static void Main(string[] args) {
            NumberManipulator n = new NumberManipulator();

            /* ローカル変数の定義 */
            int a = 150;

            Console.WriteLine("Before method call, value of a : {0}", a);

            /* 値を取得するメソッドを呼び出し */
            n.getValue(out a);

            Console.WriteLine("After method call, value of a : {0}", a);
            Console.ReadLine();
        }
    }
}

実行結果

Before method call, value of a : 150
After method call, value of a : 10

メソッド呼び出し前は150だった変数aが、getValueメソッドの処理によって10に書き換えられていることがわかります。

refとoutの違いまとめ

  • 初期化の要否:refパラメーターに渡す変数は、呼び出し前に必ず初期化が必要です。一方、outパラメーターは未初期化の変数でも渡せます。
  • メソッド内での代入:outパラメーターを受け取ったメソッドは、処理を抜ける前に必ず値を代入しなければなりません。refパラメーターにはその義務はありません。
  • 想定される用途:refは「呼び出し元の値を読み取りながら書き換える」双方向のデータ受け渡しに、outは「メソッドの処理結果を受け取る」ことに適しています。

使い分けの目安としては、既存の値をメソッド内で更新したい場合はrefを、複数の結果を返したい場合はoutを選ぶのが基本です。たとえば標準ライブラリのint.TryParseメソッドは、戻り値で変換の成否を返しつつ、outパラメーターで変換結果を受け取れる代表的な例といえます。

  1. Wi-Fi 6と5Gの違いとは?特徴・速度・使い分けを徹底解説

    5Gネットワークは、SNSなどでも頻繁に話題になる注目の技術です。同様に、Wi-Fi 6への期待も高まっていますが、これは5Gとはまったく異なる技術です。本記事では、Wi-Fi 6と5Gネットワークの違いをわかりやすく解説します。 Wi-Fi 6とは? Wi-Fi 6は、IEEE 802.11ax規格に基づく新しい認証プログラムです。従来のWi-Fi技術と異なる最大の特徴は、より遠い距離でも高速な接続を実現できる点にあります。複数のデバイスが同時に接続されていても安定したパフォーマンスを発揮し、電源環境に多少の問題があっても性能が低下しにくいという優れた特性を持っています。 Wi-Fi 6は

  2. Windows 10とWindows 11の違いを徹底比較!アップグレードすべきか判断するポイント

    Microsoft(マイクロソフト)は、数々の新機能と改善点を盛り込んだ最新OS「Windows 11」をリリースしました。一方で、これまで数多くのパッチやアップデートが適用されてきたWindows 10は、新しいWindows 11よりも安定したOSと言えます。Microsoftによると、Windows 10のサポートは2025年以降に終了する予定のため、Windows 11へアップグレードするか、Windows 10を使い続けるかを検討する時間は十分にあります。この記事では、Windows 10とWindows 11の性能・機能・改善点を比較し、新しいOSへ移行すべきか、それともWindo