[C#] 参照渡しの方法と out, ref 修飾子の違い

[C#] 参照渡しの方法と out, ref 修飾子の違い

C# の参照渡し

C#の参照渡しには、引数にref修飾子もしくはout修飾子を使います。

ref

C# で参照渡しを行うには、ref修飾子を使います。ref修飾子を付けて引数を渡すことで、値ではなく変数の参照が渡ります。

ref修飾子はメソッドの定義と呼び出し元の双方で明示的にrefを指定する必要があります。

例えば、引数の値をインクリメントするようなメソッドを考えます。

using System;

public class Program
{
    public static void Main(string[] args)
    {
        int x = 0;

        Func_Ref(ref x); // 呼び出し時でもrefを付ける
        Console.WriteLine(x); // 1
    }

    public static void Func_Ref(ref int x)
    {
        x++;
    }
}

out

C# での参照渡しには、out修飾子も使えます。

out修飾子の引数はメソッド内部から外に値を渡すというイメージで使います。したがってメソッド内部で必ず値を割り当てる必要があります。値が未割当のままコンパイルしようとするとエラーになります。

TryParseの例

out修飾子を使うメソッドでよく使うものに、TryParseメソッドがあります。戻り値でキャストの成否をBool値で返し、参照で渡した変数にキャストした値を入れてくれます。

DateTime d;
DateTime.TryParse("2017/1/1", out d);

TryParseメソッド内部でキャストした結果を外に返すのでout修飾子が使われています。

実装例

out修飾子を使うメソッドは、refと違って値をそのまま使うことはできません。必ず値を割り当てる必要があります。コンパイルエラーになるのですぐに気が付きます。

public static void Func_Out(out int x)
{
    // xに値を割り当てていないのでコンパイルエラー
    // x++;

    // メソッド内部で値を割り当てなければならない
    x = 100;
}

参考URL

C#カテゴリの最新記事