名前付き引数
CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部 — レッスン 49/70。
名前付き引数を使用すると、位置に依存するのではなく、名前を使用してどのパラメータが値を受け取るかを指定できます。これにより、メソッド呼び出しがより明確になり、任意の順序で引数を渡すことができます。
値の前にパラメータ名とコロンを続けて使用します:
public static void CreateUser(string name, int age, bool isActive)
{
Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}
// 名前付き引数を使用する
CreateUser(name: "Alice", age: 25, isActive: true);
CreateUser(age: 30, isActive: false, name: "Bob"); // どのような順序でも動作します名前付き引数は、オプションのパラメーターと組み合わせたときに真価を発揮します。先行するすべてのオプションの値を指定する代わりに、必要なものだけを直接指定してスキップすることができます。
public static void Configure(string host, int port = 8080, bool useSSL = false, int timeout = 30)
{
Console.WriteLine($"{host}:{port}, SSL: {useSSL}, Timeout: {timeout}");
}
// port と useSSL をスキップし、timeout のみを指定します
Configure("localhost", timeout: 60);
Configure("server.com", useSSL: true);位置引数と名前付き引数を混在させることもできますが、位置引数を先に記述する必要があります。名前付き引数は、特に同じ型のパラメータが複数あるメソッドや、値だけでは意味が明確ではないbooleanフラグなどの場合に、可読性を向上させます。
チャレンジ
簡単名前付き引数を活用して、メソッド呼び出しを非常に明確にするレポートジェネレーターを作成しましょう。メソッドに複数のパラメータがある場合、特に同じ型のものやブール値のフラグがある場合、名前付き引数を使用することでコードが自己文書化されます。
コードは2つのファイルに分けて構成します:
ReportGenerator.cs:Reports名前空間内に、いくつかのオプションパラメータを持つメソッドを含むReportGeneratorクラスを作成します:GenerateReport(string title, string author = "Anonymous", bool includeHeader = true, bool includeSummary = false, int maxPages = 10)- このメソッドは、レポート設定を記述するフォーマット済み文字列を返す必要があります。
- フォーマット:
Report: {title} by {author} | Header: {Yes/No}, Summary: {Yes/No}, Max Pages: {maxPages}
Program.cs: メインファイルで、不要なオプションパラメータをスキップし、各レポートにとって重要なパラメータのみを指定することで、GenerateReportをさまざまな方法で呼び出し、名前付き引数の威力を示します。
3つの入力を受け取ります:
- 1つ目のレポートのタイトル
- 2つ目のレポートのタイトル
- 3つ目のレポートのタイトル
異なる設定で3つのレポートを生成してください:
- 1つ目のレポート:タイトルのみを使用(すべてデフォルトを適用)
- 2つ目のレポート:タイトルと
includeSummary: trueおよびmaxPages: 25を使用(author と includeHeader はスキップし、デフォルトを維持) - 3つ目のレポート:タイトルと
author: "Admin"、includeHeader: false、およびincludeSummary: trueを使用(maxPages はデフォルトを維持)
各レポートの結果をそれぞれの行に出力してください。
例えば、入力が Sales Q1、Annual Review、Inventory Check の場合、出力は以下のようになります:
Report: Sales Q1 by Anonymous | Header: Yes, Summary: No, Max Pages: 10
Report: Annual Review by Anonymous | Header: Yes, Summary: Yes, Max Pages: 25
Report: Inventory Check by Admin | Header: No, Summary: Yes, Max Pages: 10名前付き引数を使用することで、関心のあるパラメータに直接スキップできることに注目してください。includeSummary を変更するためだけに author や includeHeader を指定する必要はありません。これにより、メソッド呼び出しがはるかに読みやすくなり、意図が明確になります!
チートシート
名前付き引数を使用すると、位置に依存するのではなく、名前を使用してどのパラメータが値を受け取るかを指定できます。これにより、メソッド呼び出しがより明確になり、任意の順序で引数を渡すことができます。
値の前にパラメータ名とそれに続くコロンを使用します:
public static void CreateUser(string name, int age, bool isActive)
{
Console.WriteLine($"{name}, Age: {age}, Active: {isActive}");
}
// 名前付き引数の使用
CreateUser(name: "Alice", age: 25, isActive: true);
CreateUser(age: 30, isActive: false, name: "Bob"); // どのような順序でも機能します名前付き引数は、オプションのパラメータとうまく連携します。先行するすべてのオプションの値を指定することなく、必要なパラメータに直接スキップできます:
public static void Configure(string host, int port = 8080, bool useSSL = false, int timeout = 30)
{
Console.WriteLine($"{host}:{port}, SSL: {useSSL}, Timeout: {timeout}");
}
// portとuseSSLをスキップし、timeoutのみを指定する
Configure("localhost", timeout: 60);
Configure("server.com", useSSL: true);位置引数と名前付き引数を混在させることができますが、位置引数を先にする必要があります。名前付き引数は、特に同じ型の複数のパラメータやブール値のフラグを持つメソッドにおいて、可読性を向上させます。
自分で試してみよう
using System;
using Reports;
class Program
{
public static void Main(string[] args)
{
// 3つのレポートのタイトルを読み込む
string title1 = Console.ReadLine();
string title2 = Console.ReadLine();
string title3 = Console.ReadLine();
// ReportGenerator のインスタンスを作成する
ReportGenerator generator = new ReportGenerator();
// TODO: 最初のレポートを生成する - タイトルのみを使用(すべてデフォルトを適用)
// TODO: 2番目のレポートを生成する - タイトルと includeSummary: true、maxPages: 25 を使用
// (author と includeHeader をスキップし、デフォルトを保持する)
// TODO: 3番目のレポートを生成する - タイトルと author: "Admin"、includeHeader: false、includeSummary: true を使用
// (maxPages のデフォルトを保持する)
// 各レポートの結果を出力する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。