名前付き引数
CoddyのC#ジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 49/70。
named 引数を使うと、位置に頼るのではなく、パラメーターの名前を指定して、どのパラメーターに値を渡すかを指定できます。これにより、メソッド呼び出しがより明確になり、引数を任意の順序で渡せるようになります。
値の前にパラメーター名とコロンを記述します。
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);位置指定引数とnamed引数を混在させることはできますが、位置指定引数を先に指定する必要があります。named引数を使うと可読性が向上します。特に、同じ型のパラメーターが複数あるmethodや、値だけでは意味が明らかでないブール値フラグを扱う場合に効果的です。
チャレンジ
簡単名前付き引数を活用して、メソッド呼び出しを非常に明確にするレポート生成器を作成しましょう。メソッドに複数のパラメーターがある場合、特に同じ型のパラメーターやブールフラグがある場合は、名前付き引数によってコード自体がドキュメントの役割を果たします。
コードを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まで指定する必要がないことに注目してください。これにより、メソッド呼び出しがはるかに読みやすくなり、意図も明確になります。
自分で試してみよう
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 のデフォルトを保持する)
// 各レポートの結果を出力する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: C#オンラインコンパイラ