[ C# ] メソッド引数 out と ref の違い, オプション引数と名前付き引数

Pocket

ここでは、C# のメソッド引数の参照渡し値渡しオプション引数 ( パラメータの省略 ) と名前付き引数について掲載しています。

スポンサーリンク

C# のメソッドの定義

VB.NET のようにリターン値を持つ ( Function ) 場合とリターン値を持たない ( Sub ) 場合とで定義方法が異なることはありません。同じ記述方式をとります。以下のように、リターン値を持たない場合は void 型のメソッドを定義し、リターン値を持つ場合はその型をメソッドの型として定義します。

    // ----------------------------------------
    // メソッドの呼び出し
    // ----------------------------------------
    vb_sub();
    string ret = vb_function();

    // VB.NET の Sub プロシージャ―に相当する
    public void vb_sub()
    {
        int sum = 1 + 3;
    }

    // VB.NET の Function プロシージャ―に相当する
    public string vb_function()
    {
        return "return";
    }
パラメータ: 値渡しと参照渡し

VB.NET では、パラメータ定義に、ByVal および ByRef キーワードをつけることで、その引数が値渡しなのか参照渡しなのかを定義することができます。C# では、値渡しの場合は何もつけません。参照渡しの場合は、メソッドおよび呼び出し元それぞれで ref または out キーワードを明示しなければなりません。

    // ----------------------------------------
    // メソッドの呼び出し
    // ----------------------------------------
    int p1, p2, p3;

    p1 = 0;   // 呼出し前に初期化しないとコンパイルエラー
    //p2 = 0; // 呼出し前に初期化しなくてもOK
    p3 = 0;   // 呼出し前に初期化しないとコンパイルエラー

    // メソッドの呼び出し
    func(p1, out p2, ref p3);


    // 値渡しと参照渡し
    void func(int p1, out int p2, ref int p3)
    {
        p1 = 1; // 呼び出し元に反映されない
        p2 = 2; // 呼び出し元に反映される
        p3 = 3; // 呼び出し元に反映される

        Console.WriteLine(p1.ToString());
        Console.WriteLine(p2.ToString());
        Console.WriteLine(p3.ToString());
    }
out と ref キーワードの違い

out キーワードは名前の通りメソッド内で初期化されて返されるので、 呼び出し元でパラメータを初期化する必要がありあません ( 初期化してあっても問題はない ) 。一方の ref キーワードの場合は、呼出し前に初期化されている必要があります。意識してどちらのキーワードを使用するかを決定することで、不用意な不具合を回避することの一助になります。

オプション引数(パラメータの省略)と 名前付き引数

VB.NET では、Optionalキーワード付のパラメータを定義することで、その引数を省略可能とできます。また、名前付きでパラメータを設定しプロシージャを呼び出すこともできます。C# では、C# 2010 から VB.NET と同等の定義ができるようになりました。

    int ret;
    ret = option_param(1);          // パラメーターの省略
    ret = option_param(b: 3, a: 2); // 名前付きパラメーター

    // 省略可能パラメータを持つメソッド
    public int option_param(int a = 0, int b = 0)
    {
        return (a + b);
    }
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *