C#のrefとoutキーワードの基礎知識

refとoutとは何か

C#において、refoutはメソッドのパラメータを修飾するためのキーワードです。これらのキーワードを使用する際、メソッドの定義側と呼び出し側の両方で同じキーワードを指定する必要があります。この点は厳格な規則であり、遵守しなければコンパイルエラーが発生します。

値渡しと参照渡しの違い

まず、以下のコードを実行した結果を確認してみましょう。

using System;

class ValuePassExample
{
    static void Main()
    {
        int value = 10;
        ModifyValue(value);
        Console.WriteLine(value);  // 結果: 10
    }

    static void ModifyValue(int num)
    {
        num = num + 5;
        Console.WriteLine(num);    // 結果: 15
    }
}

この結果から分かるように、メソッドModifyValue内でnumの値を15に変更していますが、Mainメソッドのvalueの値は依然として10のままです。これはC#のデフォルト動作である「値渡し(Value Passing)」所致します。

値型と参照型

値渡しを理解するには、値型と参照型の違いを把握する必要があります。値型は変数自体に実際の値を保持していますが、参照型はオブジェクトへの参照(メモリアドレス)を保持しています。例えるなら、値型は新聞紙のようなもので、所有すればその実物を持つのに対し、参照型はWebサイトのURLのようなもので、URLは実際のサイトコンテンツを指しています。

値渡しの場合、メソッドに引き渡されるのは値のコピーです。したがって、メソッド内でその値を変更しても、元の変数には影響しません。

refキーワードの使用

次に、refキーワードを使用した例を見てみましょう。

using System;

class RefPassExample
{
    static void Main()
    {
        int value = 10;
        ModifyByRef(ref value);
        Console.WriteLine(value);  // 結果: 15
    }

    static void ModifyByRef(ref int num)
    {
        num = num + 5;
        Console.WriteLine(num);    // 結果: 15
    }
}

refキーワードを使用すると、「参照渡し(Reference Passing)」になります。これはちょうど、WebサイトのURLを誰かに共有するようなものです。URLを通じてサイト内容を変更すれば、URLを共有した人都 合、その変更された内容を参照できます。

上記の例では、refを使用することで、変数の参照(メモリアDRESS)がメソッドに渡されます。メソッド内でその参照先の値を書き換えると、元の変数の値も изменяетсяします。

outキーワードの使用

outキーワードもref同様に参照渡しを行いますが、重要な違いがあります。refはメソッド呼び出し前に変数を初期化している必要がありますが、outはメソッドの内部で初期化を行えば問題ありません。

using System;

class OutExample
{
    static void Main()
    {
        int result;
        CalculateSum(10, 20, out result);
        Console.WriteLine(result);  // 結果: 30
    }

    static void CalculateSum(int a, int b, out int sum)
    {
        sum = a + b;  // ここで初期化必须
    }
}

refとoutの適用シーン

refの適切な使用例

例えば、ある商品の割引後の価格を計算する 프로그램을作成するとします。元の価格が重要で、その値を使って計算を行う場合、refを使用します。

static void ApplyDiscount(ref double price, double discountRate)
{
    price = price * (1 - discountRate);
}

outの適切な使用例

一方、int.TryParseのようなメソッドでは、変換結果を受け取る変数の初期値は意味を持ちません。変換元の文字列に基づいて結果が決まるため、outを使用します。

static void ParseInput(string input)
{
    int parsedValue;
    if (int.TryParse(input, out parsedValue))
    {
        Console.WriteLine($"変換成功: {parsedValue}");
    }
    else
    {
        Console.WriteLine("変換失敗");
    }
}

まとめ

  • refoutは 둘 다変数を参照渡しする点で 동일
  • ref: 呼び出し前に変数を初期化が必要
  • out: メソッド内部で変数を初期化すればよい
  • 使用场景に応じて適切なキーワードを選択することが重要

タグ: C# ref out Parameter-Passing value-type

7月25日 04:10 投稿