(C#) refとoutの違い・使い方

csharp-ref-out-differense

 

C#のプログラム触ってて、メソッドの引数部分に時々現れる、
refとoutと言うキーワードが気になったので、本記事では、

C#の、refとoutの違い・使い方について調べたことをまとめていこうと思う。

 

C#の、refの使い方

C#のrefは、プログラム上で参照渡しをする時に使用する
関数の呼び出し時、引数の値の前にrefと記述すると、引数は参照渡しになる。

以下refの使い方のサンプルプログラム。
引数にrefを記述して、関数内で参照渡しになった引数の値を書き換えているので、呼び出し元のプログラムでは引数に指定した変数の値が、関数内で書き換えた値に書き換わっている。

class Program
{
    static void Main(string[] args)
    {
        // 変数を初期化
        int n = 2;

        // 参照渡しでメソッドを呼ぶ
        overWrite(ref n);

        // 結果は「10」
        console.WriteLine(n);
    }

    static void overWrite(ref int val)
    {
         // 参照元の変数を書き換え
         val = 10;
    }
}

 

ポイントとしては、初期化した変数を渡す必要があることだ。

上記プログラムでは、「int n = 2」と言う形で変数を初期化した上で引数に渡してあげている。

int n; のように、宣言だけをした変数は渡してはいけないと言うことです。

 

 

C#の、outの使い方

C#のrefは、ref同様、参照渡しをする時に使うキーワードだ。

しかし、refとの違いとしては、初期化した変数を渡す必要がない点があげられる。
ただし、呼び出し先のメソッドの中で必ず値を代入しなければならないと言う性質も持ち合わせている点に注意する必要がある

 

以下、outの使い方のサンプルプログラム。

refのサンプルプログラムと内容に大差はないが、引数に渡す変数を事前に宣言だけで済ませている点、また渡した引数では、関数内で代入をしている点(outの場合必須)に注意してみてもらいたい。

class Program
{
    static void Main(string[] args)
    {
        // 変数を宣言だけする
        int n;

        // 参照渡しでメソッドを呼ぶ
        overWrite(out n);

        // 結果は「10」
        console.WriteLine(n);
    }

    static void overWrite(out int val)
    {
         // 参照元の変数に値を代入(outを使用しているメソッドなので、必須)
         val = 10;
    }
}

 

 

C#の、refとoutの違い・使い方まとめ

 

C#の、refとoutの違い・使い方まとめ

ref、out、ともに参照渡しをする際に使うキーワード
関数の呼び出し時、引数の値の前にref/outと記述すると、引数は参照渡しになる。

 

■ refの使い方で注意すること

refを使う場合、必ず初期化した変数を渡す必要があること

 

■ outの使い方

outを使う場合、初期化した変数を渡す必要がない
しかし、呼び出し先のメソッドの中で必ず値を代入しなければならない

 

 

関連記事

 

(C#) LINQとラムダ式の使い方
c#-array-collection-difference

 

https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/ref

https://www.fenet.jp/dotnet/column/language/c-sharp/8228/

https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/keywords/out-parameter-modifier

https://atmarkit.itmedia.co.jp/ait/articles/1804/25/news021.html

 

記事が気に入った方はシェアをお願いします!

コメントを残す

メールアドレスが公開されることはありません。