Menu
Coddy logo textTech

名前付き引数

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フラグなどの場合に、可読性を向上させます。

challenge icon

チャレンジ

簡単

名前付き引数を活用して、メソッド呼び出しを非常に明確にするレポートジェネレーターを作成しましょう。メソッドに複数のパラメータがある場合、特に同じ型のものやブール値のフラグがある場合、名前付き引数を使用することでコードが自己文書化されます。

コードは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. 1つ目のレポート:タイトルのみを使用(すべてデフォルトを適用)
  2. 2つ目のレポート:タイトルと includeSummary: true および maxPages: 25 を使用(author と includeHeader はスキップし、デフォルトを維持)
  3. 3つ目のレポート:タイトルと author: "Admin"includeHeader: false、および includeSummary: true を使用(maxPages はデフォルトを維持)

各レポートの結果をそれぞれの行に出力してください。

例えば、入力が Sales Q1Annual ReviewInventory 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 を変更するためだけに authorincludeHeader を指定する必要はありません。これにより、メソッド呼び出しがはるかに読みやすくなり、意図が明確になります!

チートシート

名前付き引数を使用すると、位置に依存するのではなく、名前を使用してどのパラメータが値を受け取るかを指定できます。これにより、メソッド呼び出しがより明確になり、任意の順序で引数を渡すことができます。

値の前にパラメータ名とそれに続くコロンを使用します:

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 のデフォルトを保持する)
        

        // 各レポートの結果を出力する
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

オブジェクト指向プログラミングのすべてのレッスン