【C#】仮引数にデフォルト値を設定する

ども、村正です。

今回はメソッドの仮引数に「デフォルト値」を設定する方法について紹介していきます。

仮引数にデフォルト値を設定する

仮引数にデフォルト値を設定することで「値が指定されなかった場合は、その値(デフォルト値)を仮引数に格納して処理する」ことができます。

以下ではメソッドの第二仮引数honorificWordにデフォルト値を設定しています。

public class Program
{
    /// <summary>
    /// エントリポイント
    /// </summary>
    /// <param name="args"></param>
    static void Main(string[] args)
    {
        var name = "村正";

        var addHonorificName = AddHonorific(name);
        Console.WriteLine(addHonorificName);

        var addHonorificName_1 = AddHonorific(name, "くん");
        Console.WriteLine(addHonorificName_1);
    }

    /// <summary>
    /// 指定した名前に敬語をつけるメソッド
    /// </summary>
    /// <param name="name"></param>
    /// <param name="honorificWord"></param>
    public static string AddHonorific(string name, string honorificWord = "様")
    {
        return $"{name}{honorificWord}";
    }
}

村正様
村正くん

引数honorificWordを指定しない場合はデフォルト値が使われていることがわかると思います。

もちろん呼び出し側で値を指定することもできます(今回はくんを指定することで、村正様ではなく村正くんという文字列を作るようにしています)。

【おまけ】仮引数にデフォルト値を使うと便利なケース

引数のオプション化

例として「特定の文字列をコンソール画面に表示する」メソッドを考えてみましょう。このメソッドは基本的に1回だけメッセージを表示するのですが、オプションとして任意の表示回数を指定できるようにします。

public class Program
{
    /// <summary>
    /// エントリポイント
    /// </summary>
    /// <param name="args"></param>
    static void Main(string[] args)
    {
        var message = "こんにちは";

        // デフォルト値を使用した表示
        PrintMessage(message);

        Console.WriteLine("==========");

        // 3回表示するように指定
        PrintMessage(message, 3);
    }

    /// <summary>
    /// メッセージを表示する(デフォルト:1回)
    /// </summary>
    /// <param name="message"></param>
    /// <param name="repeateCount"></param>
    public static void PrintMessage(string message, int repeateCount = 1)
    {
        for (int i = 0; i < repeateCount; i++)
        {
            Console.WriteLine(message);
        }
    }
}

こんにちは
==========
こんにちは
こんにちは
こんにちは

オーバーロードの削減

オーバーロードとは「名前は同じだが仮引数が異なるメソッドを定義すること」です。

仮引数にデフォルト値を設定することで、その仮引数は「指定しても指定しなくても良い」という状態になります。これによりオーバーロードを減らすことができます。

具体的には、以下のコードが、、、

public class Program
{
    /// <summary>
    /// エントリポイント
    /// </summary>
    /// <param name="args"></param>
    static void Main(string[] args)
    {
        var message = "こんにちは";

        // 表示
        PrintMessage(message);

        Console.WriteLine("==========");

        // 3回表示するように指定
        PrintMessage(message, 3);
    }

    /// <summary>
    /// メッセージを表示する
    /// </summary>
    /// <param name="message"></param>
    public static void PrintMessage(string message)
    {
        Console.WriteLine(message);
    }

    /// <summary>
    /// 指定回数だけメッセージを表示する
    /// </summary>
    /// <param name="message"></param>
    /// <param name="repeateCount"></param>
    public static void PrintMessage(string message, int repeateCount)
    {
        for (int i = 0; i < repeateCount; i++)
        {
            Console.WriteLine(message);
        }
    }
}

以下のように、1つのメソッドにまとめることができます(オーバーロードがなくなる)。

public class Program
{
    /// <summary>
    /// エントリポイント
    /// </summary>
    /// <param name="args"></param>
    static void Main(string[] args)
    {
        var message = "こんにちは";

        // デフォルト値を使用した表示
        PrintMessage(message);

        Console.WriteLine("==========");

        // 3回表示するように指定
        PrintMessage(message, 3);
    }

    /// <summary>
    /// メッセージを表示する(デフォルト:1回)
    /// </summary>
    /// <param name="message"></param>
    /// <param name="repeateCount"></param>
    public static void PrintMessage(string message, int repeateCount = 1)
    {
        for (int i = 0; i < repeateCount; i++)
        {
            Console.WriteLine(message);
        }
    }
}

既存のコードをそのままにメソッドに機能を追加できる

デフォルト値が設定された仮引数は、呼び出し側では「指定しなくても指定してもどちらでもよい仮引数」となります。つまり、メソッドに新しい仮引数を追加して機能を拡張するとき、デフォルト値を設定すれば既存のコードを変更する必要がなくなります。

たとえば当初、以下のようにメッセージは1回のみ表示するものだったとします。

public class Program
{
    /// <summary>
    /// エントリポイント
    /// </summary>
    /// <param name="args"></param>
    static void Main(string[] args)
    {
        var message = "こんにちは";

        // 表示
        PrintMessage(message);
    }

    /// <summary>
    /// メッセージを表示する
    /// </summary>
    /// <param name="message"></param>
    public static void PrintMessage(string message)
    {
        Console.WriteLine(message);
    }
}

しかしあるとき「1回だけの表示ではなく任意の数だけメッセージを表示できるようにしたい」となったとします。そんなとき表示回数を表す仮引数をデフォルト値付きで追加することで、呼び出し元の実装を変えなくてもメソッドの機能を追加することができます。

public class Program
{
    /// <summary>
    /// エントリポイント
    /// </summary>
    /// <param name="args"></param>
    static void Main(string[] args)
    {
        var message = "こんにちは";

        // デフォルト値を使用した表示
        PrintMessage(message);

        Console.WriteLine("==========");

        // 3回表示するように指定
        PrintMessage(message, 3);
    }

    /// <summary>
    /// メッセージを表示する(デフォルト:1回)
    /// </summary>
    /// <param name="message"></param>
    /// <param name="repeateCount"></param>
    public static void PrintMessage(string message, int repeateCount = 1)
    {
        for (int i = 0; i < repeateCount; i++)
        {
            Console.WriteLine(message);
        }
    }
}

※ちょっと例がいまいちだったかも

コメント