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

【C#】メソッドから複数の値を返す4つの方法(ref・out・配列・タプル)

C#では、1つのメソッドから複数の値を返したい場面がよくあります。C#には主に以下の4つのアプローチがあります。

  • ref(参照)パラメータを使う
  • out(出力)パラメータを使う
  • 配列を返す
  • タプル(Tuple)を返す

それぞれの方法について、コード例と実行結果とともに詳しく解説します。

1. ref(参照)パラメータを使う方法

ref キーワードを使うと引数を参照渡しでき、メソッド内で変更した値が呼び出し元にも反映されます。通常の戻り値と組み合わせることで、実質的に2つの値を受け取ることが可能です。なお、ref 引数に渡す変数は、呼び出し前に初期化しておく必要があります。

コード例

class Program{
    static int ReturnMultipleValuesUsingRef(int firstNumber, ref int secondNumber){
        secondNumber = 20;
        return firstNumber;
    }
    static void Main(){
        int a = 10;
        int refValue = 0;
        var res = ReturnMultipleValuesUsingRef(a, ref refValue);
        System.Console.WriteLine($" Ref Value {refValue}");
        System.Console.WriteLine($" Function Return Value {res}");
        Console.ReadLine();
    }
}

実行結果

Ref Value 20
Function Return Value 10

2. out(出力)パラメータを使う方法

out キーワードも ref と同様に参照渡しを行いますが、「メソッド内で必ず値を代入する」というルールがある点が異なります。呼び出し元で事前の初期化が不要なため、メソッドから追加の結果を受け取る用途により適しています。

コード例

class Program{
    static int ReturnMultipleValuesUsingOut(int firstNumber, out int secondNumber){
        secondNumber = 20;
        return firstNumber;
    }
    static void Main(){
        int a = 10;
        int outValue = 0;
        var res = ReturnMultipleValuesUsingOut(a, out outValue);
        System.Console.WriteLine($" Out Value {outValue}");
        System.Console.WriteLine($" function Return Value {res}");
        Console.ReadLine();
    }
}

実行結果

Out Value 20
Function Return Value 10

3. 配列を返す方法

同じ型の複数の値を返すだけであれば、配列を戻り値にするのが最もシンプルです。ただし、インデックスでしかアクセスできないため、値の意味が分かりにくくなりやすい点には注意が必要です。

コード例

class Program{
    static int[] ReturnArrays(){
        int[] arrays = new int[2] { 1, 2 };
        return arrays;
    }
    static void Main(){
        var res = ReturnArrays();
        System.Console.WriteLine($"{res[0]} {res[1]}");
        Console.ReadLine();
    }
}

実行結果

1 2

4. タプル(Tuple)を返す方法

Tuple<T1, T2> を使えば、異なる型の複数の値を1つのオブジェクトとしてまとめて返せます。値には Item1Item2 のようなプロパティ経由でアクセスします。なお、C# 7.0以降ではより軽量な ValueTuple を使えば、要素に名前を付けて可読性の高いコードを書くこともできます。

コード例

class Program{
    static Tuple<int, int> ReturnMulitipleVauesUsingTuples(){
        return new Tuple<int, int>(10, 20);
    }
    static void Main(){
        var res = ReturnMulitipleVauesUsingTuples();
        System.Console.WriteLine($"{res.Item1} {res.Item2}");
        Console.ReadLine();
    }
}

実行結果

10 20

まとめ:使い分けのポイント

  • ref パラメータ: 呼び出し元での初期化が必要。既存の変数の値を更新する用途に向いています。
  • out パラメータ: メソッド内での代入が必須。初期化不要なので、処理結果を追加で受け取るのに適しています。
  • 配列: 同じ型の値を手軽に複数返せますが、インデックスアクセスのため可読性はやや劣ります。
  • タプル: 異なる型でも返せます。C# 7.0以降の ValueTuple と組み合わせれば、現代のC#で最も推奨される方法です。
  1. JavaScript関数からオブジェクトを返す方法をわかりやすく解説

    JavaScriptの関数からオブジェクトを返すには、return文を使用します。オブジェクト内のプロパティやメソッドにアクセスする際は、thisキーワードを活用すると便利です。この記事では、実際のコード例を使いながら、JavaScript関数からオブジェクトを返す基本的な方法を解説します。基本的な考え方JavaScriptでは、オブジェクトの中にメソッド(関数)を定義できます。そのメソッド内でreturn文を使えば、処理結果や値を呼び出し元に返すことができます。また、thisキーワードを参照することで、同じオブジェクト内の他のプロパティにアクセス可能です。サンプルコード以下のコードでは、従業

  2. C#のジェネリックメソッドからnullを返す方法:default(T)の使い方

    ジェネリック(Generics)を使うと、フィールド、メソッド、パラメータなどの型をプレースホルダー(型パラメータ)として持つクラスを定義できます。これらのプレースホルダーは、コンパイル時に具体的な型へと置き換えられます。ジェネリックは山括弧 <> を使って定義するのが基本です。C#のコレクションにおける主な制限の一つは、効果的な型チェックが行えないことです。C#ではすべてのクラスがobject基底クラスから派生しているため、コレクションには原理的にどんなオブジェクトでも格納できてしまいます。さらに、通常のメソッドとは異なり、ジェネリックメソッドから単純にnullを返すことはできま