Menu
Coddy logo textTech

名前付き引数

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や、値だけでは意味が明らかでないブール値フラグを扱う場合に効果的です。

challenge icon

チャレンジ

簡単

名前付き引数を活用して、メソッド呼び出しを非常に明確にするレポート生成器を作成しましょう。メソッドに複数のパラメーターがある場合、特に同じ型のパラメーターやブールフラグがある場合は、名前付き引数によってコード自体がドキュメントの役割を果たします。

コードを2つのファイルに整理します。

  • ReportGenerator.csReports名前空間に、複数のオプションパラメーターを持つメソッドを含む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: truemaxPages: 25を指定してタイトルを使用します(authorとincludeHeaderは省略し、それらの既定値を維持します)
  3. 3つ目のレポート:author: "Admin"includeHeader: falseincludeSummary: 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まで指定する必要がないことに注目してください。これにより、メソッド呼び出しがはるかに読みやすくなり、意図も明確になります。

自分で試してみよう

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腕試し

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

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

自分で練習してみよう: C#オンラインコンパイラ