オプション引数
CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 48/70。
オプショナル引数を使用すると、メソッドの引数にデフォルト値を定義できます。呼び出し側がその引数に値を指定しない場合、デフォルト値が自動的に使用されます。
メソッドのシグネチャでデフォルト値を割り当てることで、オプション引数を作成できます。
public static void Greet(string name, string greeting = "Hello")
{
Console.WriteLine(greeting + ", " + name + "!");
}
// どちらの呼び出しも有効です
Greet("Alice"); // Hello, Alice!
Greet("Bob", "Welcome"); // Welcome, Bob!オプション引数は、すべての必須引数の後に記述する必要があります。複数のオプション引数を持つことができ、呼び出し側は右側の引数から順に省略できます。
public static void CreateUser(string name, int age = 0, bool isActive = true)
{
Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}
CreateUser("Emma"); // Emma, Age: 0, Active: True
CreateUser("James", 25); // James, Age: 25, Active: True
CreateUser("Sarah", 30, false); // Sarah, Age: 30, Active: Falseデフォルト値は、リテラル、const 値、または default 式といったコンパイル時定数である必要があります。変数やメソッド呼び出しをデフォルトとして使用することはできません。これにより、オプション引数は、設定項目や、ほとんどの呼び出し元が共通の値を使用するメソッドに最適です。
チャレンジ
簡単オプション引数を使用して柔軟なメッセージフォーマットを提供する通知システムを構築しましょう。ほとんどの呼び出し元が適切なデフォルト値を使用できる、カスタマイズ可能な設定を持つ通知送信用のユーティリティクラスを作成します。
コードは2つのファイルに分けて構成します:
NotificationService.cs:Notifications名前空間内にNotificationServiceクラスを作成し、オプション引数を示すメソッドを実装します:SendNotification(string message, string priority = "Normal", bool addTimestamp = true)- このメソッドは、フォーマットされた通知文字列を返す必要があります。addTimestampが true の場合、メッセージの先頭に[TIMESTAMP]を付加します。フォーマットは、タイムスタンプの設定に応じて[Priority] Messageまたは[TIMESTAMP] [Priority] Messageとします。
Program.cs: メインファイルで、すべてデフォルトを使用する場合、1つの引数を上書きする場合、および両方のオプション引数を上書きする場合の3つの異なる方法でSendNotificationを呼び出し、オプション引数がどのように機能するかを示します。
3つの入力を受け取ります:
- 1つ目のメッセージ(すべてのデフォルト値を使用します)
- 2つ目のメッセージ(優先度
"Urgent"を指定し、デフォルトのタイムスタンプを使用します) - 3つ目のメッセージ(優先度
"Low"を指定し、タイムスタンプなしを使用します)
SendNotification を3回呼び出し、それぞれの結果を出力してください:
- 1回目の呼び出し:1つ目のメッセージのみを渡します(デフォルトの
"Normal"優先度、タイムスタンプ有効を使用) - 2回目の呼び出し:2つ目のメッセージと
"Urgent"優先度を渡します(タイムスタンプはデフォルトの true のまま) - 3回目の呼び出し:3つ目のメッセージと
"Low"優先度、およびタイムスタンプにfalseを渡します
例えば、入力が System started、Server overload、Cache cleared の場合、出力は以下のようになります:
[TIMESTAMP] [Normal] System started
[TIMESTAMP] [Urgent] Server overload
[Low] Cache cleared同じメソッドがこれら3つのシナリオをいかにエレガントに処理しているかに注目してください。呼び出し元はデフォルトから変更したい部分だけを指定すればよいのです!
チートシート
オプション引数を使用すると、メソッドの引数にデフォルト値を定義できます。呼び出し側が値を指定しない場合、デフォルト値が自動的に使用されます。
メソッドのシグネチャでデフォルト値を代入することで、オプション引数を作成します。
public static void Greet(string name, string greeting = "Hello")
{
Console.WriteLine(greeting + ", " + name + "!");
}
// どちらの呼び出しも動作します
Greet("Alice"); // Hello, Alice!
Greet("Bob", "Welcome"); // Welcome, Bob!オプション引数は、すべての必須引数の後に配置する必要があります。複数のオプション引数を持つことも可能です。
public static void CreateUser(string name, int age = 0, bool isActive = true)
{
Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}
CreateUser("Emma"); // Emma, Age: 0, Active: True
CreateUser("James", 25); // James, Age: 25, Active: True
CreateUser("Sarah", 30, false); // Sarah, Age: 30, Active: Falseデフォルト値は、リテラル、const 値、または default 式といったコンパイル時定数である必要があります。変数やメソッドの呼び出しをデフォルト値として使用することはできません。
自分で試してみよう
using System;
using Notifications;
class Program
{
public static void Main(string[] args)
{
// 3つのメッセージを読み取ります
string message1 = Console.ReadLine();
string message2 = Console.ReadLine();
string message3 = Console.ReadLine();
// NotificationService のインスタンスを作成します
NotificationService service = new NotificationService();
// TODO: SendNotification を3回呼び出し、各結果を出力します:
// 1. 最初の呼び出し: message1 のみを渡します(すべてのデフォルト値を使用します)
// 2. 2回目の呼び出し: message2 を "Urgent" 優先度で渡します(timestamp はデフォルトの true になります)
// 3. 3回目の呼び出し: message3 を "Low" 優先度で、timestamp に false を指定して渡します
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。