C#でメソッドを定義する際、「この引数はいつも同じ値を渡しているな」「呼び出す時に毎回指定するのは面倒だな」と感じることはありませんか。
これを使いこなせば、同じようなメソッドをいくつも定義する(オーバーロード)必要がなくなり、コードが劇的にスッキリします。
しかし、数値や文字列のような単純な型なら簡単ですが、「配列やリストをデフォルト値にしたい」「途中にある引数だけ省略したい」といった場面では、少し工夫が必要です。
この記事では、C#におけるデフォルト引数(オプション引数)の基本的な使い方から、null やオブジェクトを初期値にするテクニック、そして名前付き引数を活用したスマートな呼び出し方まで、実務で役立つ知識をサンプルコード付きで解説します。
![]() 執筆者:マヒロ |
|
デフォルト引数(オプション引数)の基本的な書き方
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>(); と記述しています。
これは「もし data が null ならば、右辺(新しい空のリスト)を代入する」という意味のモダンな書き方です。
このパターンを使うことで、実質的に「空のリストをデフォルト値にする」という挙動を実現できます。
配列(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#の案件を探しやすくなります。
転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。



