[C#] メソッドの引数にoutを付けて出力として利用する

メソッドの定義で引数にoutと付いているものがあります。
今回はout引数を使ったメソッドの話です。

結論から書くと、outはメソッドの処理内でその引数に値を設定するときに使います。outを付けるとその引数は入力としてではなく出力として使うという意味になります。

これはC言語でよく使われていた手法で、処理が正常に終わったかどうかを戻り値で返し、処理の中で計算した値を引数に入れて返す、というものです。

いまだとタプルなどを使って複数の戻り値を返すことが出来るようになったので、自分でメソッドを定義するときはそっちを使った方がいいと思います。

ですが、C#標準のメソッドにはout引数のあるものがまだ存在するので、使い方を覚えておく必要があります。

また、引数を入力にも出力にも使いたいという場合は refを引数に付けます。refについては別記事で詳しく説明していきます。

[C#] メソッドの引数にrefを付けて参照渡しにする
C#のメソッド定義のときに引数にrefを付けると参照渡しという方法で引数が渡されます。通常の値渡しと違い呼び出し元で指定した変数に影響を与えます。値型、参照型の変数を値渡し、参照渡しで引数を指定する4つのパターンがあります。
スポンサーリンク

out引数の使い方

文字列をint型に変換できるかチェックするint.TryParseメソッドはoutが付いている引数を持っています。

public static bool TryParse(string? s, out Int32 result);

このメソッドの戻り値は文字列がint型に変換できる場合はTrue、できない場合はFalseを返します。
第1引数には変換したい文字列を、
第2引数には第1引数の文字列をint型に変換した値を設定する変数を指定します。

TryParseの戻り値がTrueの場合に、第2引数で指定した変数に文字列がint型に変換された値が設定されます。

class Program
{
    public static void Main() 
    {
        bool isNumber = false;
        int number1;
        isNumber = int.TryParse("100", out number1);
        System.Console.WriteLine(isNumber);
        System.Console.WriteLine(number1);

        int number2;
        isNumber = int.TryParse("abc", out number2);
        System.Console.WriteLine(isNumber);
        System.Console.WriteLine(number2);
    }
}

出力結果はこんな感じです。

True
100
False
0

戻り値がTrueの時は、変換された100が変数number1に代入されています。
Falseの時は、何も設定されません。

このようにout引数を持つメソッドを実行するときは、値設定用の変数を定義してメソッドの引数に指定します。また、呼び出し側も out を付ける必要があります。

out引数に変数を指定する際に変数の宣言も同時に行う

メソッドを呼び出すときに値設定用の変数の定義も同時に行うことができます。(C#7.0から)

class Program
{
    public static void Main() 
    {
        bool isNumber = false;
        isNumber = int.TryParse("100", out int number1);
        System.Console.WriteLine(isNumber);
        System.Console.WriteLine(number1);
    }
}

型推論varも使えます。

class Program
{
    public static void Main() 
    {
        bool isNumber = false;
        isNumber = int.TryParse("100", out var number1);
        System.Console.WriteLine(isNumber);
        System.Console.WriteLine(number1);
    }
}
スポンサーリンク

out引数を持つメソッドを定義するときの注意

out引数はメソッド内で必ず値を設定する必要があります。

class Program
{
    static bool Method(out int num)
    {
        // out引数はメソッド内で値を設定する必要がある
        num = 999;
        return true;
    }

    public static void Main() 
    {
        bool result = Method(out int number1);
        System.Console.WriteLine(result);     // True
        System.Console.WriteLine(number1);    // 999
    }
}

クラスなどの参照型の場合も同じく値を設定する必要があります。

class Program
{
    static void Method(out SampleClass cls)
    {
        // 参照型の場合もメソッド内で値(インスタンス)を設定する必要がある
        cls = new SampleClass() { x = 10, y = 20 };
    }

    public static void Main() 
    {
        Method(out var sample);
        System.Console.WriteLine(sample.x);
        System.Console.WriteLine(sample.y);
    }
}

class SampleClass
{ 
    public int x { get; set; }
    public int y { get; set; }
}

C# プログラミング講座に戻る

コメント

タイトルとURLをコピーしました