記事内にはプロモーションが含まれています

【C#】引数のデフォルト値を設定する方法!省略可能な引数やnull・配列の扱いまで解説

【C#】引数のデフォルト値を設定する方法!省略可能な引数やnull・配列の扱いまで解説 C#

C#でメソッドを定義する際、「この引数はいつも同じ値を渡しているな」「呼び出す時に毎回指定するのは面倒だな」と感じることはありませんか。

そんな時に役立つのが、引数に初期値を設定して「省略可能(オプション)」にする機能です。

これを使いこなせば、同じようなメソッドをいくつも定義する(オーバーロード)必要がなくなり、コードが劇的にスッキリします。

しかし、数値や文字列のような単純な型なら簡単ですが、「配列やリストをデフォルト値にしたい」「途中にある引数だけ省略したい」といった場面では、少し工夫が必要です。

この記事では、C#におけるデフォルト引数(オプション引数)の基本的な使い方から、null やオブジェクトを初期値にするテクニック、そして名前付き引数を活用したスマートな呼び出し方まで、実務で役立つ知識をサンプルコード付きで解説します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はこじんまりとしたプログラミングスクールを運営
  • モットーは「利他の精神」

デフォルト引数(オプション引数)の基本的な書き方

C#では、メソッドの宣言時に引数へ値を代入しておくことで、呼び出し時にその引数を省略できるようになります。

これを「デフォルト引数」や「オプション引数」と呼びます。

基本的な構文とルール

使い方は非常にシンプルで、メソッド定義の引数リストで 型 変数名 = 値 と記述するだけです。

ただし、「必須の引数(デフォルト値なし)を先に書き、オプション引数は最後にまとめる」という重要なルールがあります。

using System;

class Program
{
    // message: 必須引数
    // count: オプション引数(省略時は1になる)
    // suffix: オプション引数(省略時は "!" になる)
    static void PrintMessage(string message, int count = 1, string suffix = "!")
    {
        for (int i = 0; i < count; i++)
        {
            Console.WriteLine($"{message}{suffix}");
        }
    }

    static void Main()
    {
        // 1. 引数をすべて指定する場合
        PrintMessage("Hello", 2, "?");
        
        // 2. 最後の引数を省略する場合
        PrintMessage("Good Morning", 3);
        
        // 3. オプション引数をすべて省略する場合
        PrintMessage("Hi");
    }
}

実行結果

Hello?
Hello?
Good Morning!
Good Morning!
Hi!

PrintMessage メソッドの第2引数 count と第3引数 suffix にデフォルト値を設定しています。

Main メソッドでの呼び出しを見ると、引数を省略した場合は自動的に設定された初期値(1!)が使われていることがわかります。

これにより、メソッドのオーバーロード(引数の数違いのメソッド)をいくつも作る手間が省け、コードの保守性が向上します。

複数の引数がある場合に「途中だけ」省略する方法

オプション引数が複数ある場合、通常は「後ろから順に」しか省略できません。

しかし、「名前付き引数」という機能を組み合わせることで、任意の引数だけを指定して呼び出すことが可能になります。

名前付き引数を使った呼び出しテクニック

例えば、「3番目の引数だけ指定して、2番目はデフォルト値のままにしたい」というケースを見てみましょう。

using System;

class Program
{
    static void Log(string message, string level = "INFO", bool timeStamp = true)
    {
        string timeStr = timeStamp ? $"[{DateTime.Now:HH:mm:ss}] " : "";
        Console.WriteLine($"{timeStr}[{level}] {message}");
    }

    static void Main()
    {
        // levelは省略したいが、timeStampはfalseにしたい場合
        // Log("Error occurred", false); // コンパイルエラー(第2引数の型が違うため)

        // 名前付き引数を使えば解決!
        Log("System starting", timeStamp: false);
        
        // 順番を入れ替えることも可能(あまり推奨はされませんが)
        Log(level: "WARN", message: "Memory low");
    }
}

実行結果

[INFO] System starting [WARN] Memory low

Log("System starting", timeStamp: false) のように、引数名: 値 の形式で記述することで、間の引数 level を飛ばして timeStamp に値を渡すことができます。

この機能は、引数が多いメソッドにおいて「どの引数に何を設定しているか」を明示する可読性向上のテクニックとしても、現在の開発現場では頻繁に利用されています。

配列やリスト(参照型)をデフォルト値にする方法

ここで、初心者が最もつまずくポイントがあります。

それは、「配列やList、クラスのインスタンス(new …)はデフォルト値に設定できない」という制約です。

デフォルト引数に指定できるのは、コンパイル時に値が確定する「定数(数値、文字列、null)」に限られます。

nullを活用した実装パターン

配列やオブジェクトをデフォルト値にしたい場合は、引数の初期値を null に設定し、メソッドの内部で「nullだったら新しいインスタンスを作る」というロジックを書くのが定石です。

using System;
using System.Collections.Generic;

class Program
{
    // List<int> list = new List<int>() とは書けない!
    // 代わりに null を設定する
    static void ProcessData(string name, List<int> data = null)
    {
        // null合体割り当て演算子(??=)を使って初期化
        data ??= new List<int>();

        Console.WriteLine($"Name: {name}, DataCount: {data.Count}");
        foreach(var item in data)
        {
            Console.WriteLine(item);
        }
    }

    static void Main()
    {
        // リストを渡す場合
        ProcessData("Test1", new List<int> { 1, 2, 3 });

        // 省略する場合(内部で空リストが生成される)
        ProcessData("Test2");
    }
}

実行結果

Name: Test1, DataCount: 3
1
2
3
Name: Test2, DataCount: 0

メソッド定義では List<int> data = null とし、メソッドの先頭で data ??= new List<int>(); と記述しています。

これは「もし datanull ならば、右辺(新しい空のリスト)を代入する」という意味のモダンな書き方です。

このパターンを使うことで、実質的に「空のリストをデフォルト値にする」という挙動を実現できます。
配列(int[])の場合も同様に null をデフォルト値にして対応します。

構造体やDateTimeをデフォルト値にする場合

DateTime.Now(現在時刻)なども定数ではないため、デフォルト引数には直接指定できません。

これも先ほどと同様に、null (または Nullable<DateTime>) を活用して解決します。

現在時刻をデフォルトにする実装例

static void SaveLog(string text, DateTime? date = null)
{
    // dateが指定されていればその値を、nullなら現在時刻を使用
    DateTime targetDate = date ?? DateTime.Now;

    Console.WriteLine($"{targetDate}: {text}");
}

引数の型を DateTime?(null許容型)にしている点がポイントです。

これにより、呼び出し側が引数を省略した場合は null が渡され、メソッド内で DateTime.Now に置き換わります。

「実行した瞬間の時間」をデフォルト値にしたい場合には、このパターンが必須となります。

C#のスキルを活かして年収を上げる方法

以上、C#で引数のデフォルト値を設定する方法について解説してきました。

なお、C#のスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。

業務システム開発やアプリ開発、ゲーム開発において需要の高いC#を扱えるエンジニアは、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。

なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。

今すぐ転職する気がなくとも、とりあえず転職エージェントに無料登録しておくだけで、スカウトが届いたり、思わぬ好待遇の求人情報が送られてきたりするというメリットがあります。

併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなC#の案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。

C#
スポンサーリンク
code-izumiをフォローする