演習 - 省略可能なパラメーターを持つメソッド

完了

C Sharp 言語では、名前付きパラメーターと省略可能なパラメーターを使用できます。 これらの型のパラメーターを使用すると、メソッドに指定する引数を選択できるため、メソッド シグネチャで定義されている構造に制限されません。

名前付き引数を使用すると、位置ではなく名前を使用してパラメーターの値を指定できます。 省略可能なパラメーターを使用すると、メソッドを呼び出すときにこれらの引数を省略できます。

この演習では、名前付きパラメーターと省略可能なパラメーターの両方を使用する方法について説明します。

RSVP アプリケーションを作成する

このタスクでは、イベントに対する RSVP へのゲスト用の簡単なアプリケーションを作成します。 ゲストは参加人数とアレルギー情報を提供します。 また、招待専用のゲスト リストに RSSP を制限するオプションも追加します。

  1. Visual Studio Code エディターで、前の演習の既存のコードを削除します。

  2. Visual Studio Code エディターに次のコードを入力します。

    string[] guestList = {"Rebecca", "Nadia", "Noor", "Jonte"};
    string[] rsvps = new string[10];
    int count = 0;
    
    void RSVP(string name, int partySize, string allergies, bool inviteOnly) 
    {
        if (inviteOnly)
        {
            // search guestList before adding rsvp
        }
    
        rsvps[count] = $"Name: {name}, \tParty Size: {partySize}, \tAllergies: {allergies}";
        count++;
    }
    
    void ShowRSVPs()
    {
        Console.WriteLine("\nTotal RSVPs:");
        for (int i = 0; i < count; i++)
        {
            Console.WriteLine(rsvps[i]);
        }
    }
    

    このコードでは、ゲスト リストと rsvps を格納する変数を作成します。 RSVP メソッドはゲスト情報をリストに追加し、ShowRSVPs メソッドはゲスト情報をタブエスケープシーケンスで区切って、合計のRSVP件数を表示します。

  3. ゲスト リストを検索するには、 RSVP メソッドに次のコードを入力します。

    if (inviteOnly)
    {
        bool found = false;
        foreach (string guest in guestList)
        {
            if (guest.Equals(name)) {
                found = true;
                break;
            }
        }
        if (!found)
        {
            Console.WriteLine($"Sorry, {name} is not on the guest list");
            return;
        }
    }
    

    このコードでは、指定された名前がゲスト リストの名前と等しいかどうかを確認します。 一致するものが見つかった場合は、 found を true に設定し、 foreach ループから抜け出します。 found false の場合は、メッセージを表示し、return キーワードを使用してメソッドを終了します。

  4. RSVP メソッド シグネチャの上に次のコードを追加して、メソッドを呼び出します。

    RSVP("Rebecca", 1, "none", true);
    RSVP("Nadia", 2, "Nuts", true);
    RSVP("Linh", 2, "none", false);
    RSVP("Tony", 1, "Jackfruit", true);
    RSVP("Noor", 4, "none", false);
    RSVP("Jonte", 2, "Stone fruit", false);
    ShowRSVPs();
    
  5. コードを保存して実行し、次の出力を確認します。

    Sorry, Tony is not on the guest list
    
    Total RSVPs:
    Name: Rebecca,  Party Size: 1,  Allergies: none
    Name: Nadia,    Party Size: 2,  Allergies: Nuts
    Name: Linh,     Party Size: 2,  Allergies: none
    Name: Noor,     Party Size: 4,  Allergies: none
    Name: Jonte,    Party Size: 2,  Allergies: Stone fruit
    

名前付き引数を使用する

多くのパラメーターを受け取るメソッドを呼び出す場合、引数が何を表すのかを理解するのは難しい場合があります。 名前付き引数を使用すると、コードの読みやすさを向上させることができます。 パラメーター名の後に引数値を指定して、名前付き引数を使用します。 このタスクでは、名前付き引数の使用を練習します。

  1. 次のコード行を見つけます。 RSVP("Linh", 2, "none", false);

  2. メソッド呼び出しを次のように更新します。

    RSVP(name: "Linh", partySize: 2, allergies: "none", inviteOnly: false);
    

    パラメーターの名前を指定し、その後にコロンと値を付けます。 この構文では、名前付き引数を定義します。 すべての引数に名前を付ける必要はありません。 たとえば、次の構文も有効です。

    RSVP("Linh", 2, allergies: "none", inviteOnly: false); RSVP("Linh", partySize: 2, "none", false);

    位置引数と共に使用される名前付き引数は、正しい位置で使用されている場合は有効です。 名前付き引数は、位置引数が後に続かない場合にも有効です。 たとえば、末尾に "Linh"2 を含めると無効になります。

    RSVP(allergies: "none", inviteOnly: false, "Linh", 2);

    このコードを入力すると、次のエラーが発生します。 Named argument 'allergies' is used out-of-position but is followed by an unnamed argument

  3. 次のコード行を見つけます。 RSVP("Tony", 1, "Jackfruit", true);

  4. メソッド呼び出しを次のように更新します。

    RSVP("Tony", inviteOnly: true, allergies: "Jackfruit",  partySize: 1);
    

    名前付き引数は元の順序で表示する必要はありません。 ただし、名前のない引数 Tony は位置引数であり、一致する位置に出現する必要があります。

  5. コードを保存して実行し、次の出力を確認します。

    Sorry, Tony is not on the guest list
    
    Total RSVPs:
    Name: Rebecca,  Party Size: 1,  Allergies: none
    Name: Nadia,    Party Size: 2,  Allergies: Nuts
    Name: Linh,     Party Size: 2,  Allergies: none
    Name: Noor,     Party Size: 4,  Allergies: none
    Name: Jonte,    Party Size: 2,  Allergies: Stone fruit
    

    名前付き引数を使用しても出力は変更されません。

省略可能なパラメーターを宣言する

既定値が割り当てられると、パラメーターは省略可能になります。 省略可能なパラメーターを引数から省略すると、メソッドの実行時に既定値が使用されます。 この手順では、パラメーター partySizeallergiesinviteOnly を省略可能にします。

  1. 省略可能なパラメーターを定義するには、 RSVP メソッドシグネチャを次のように更新します。

    void RSVP(string name, int partySize = 1, string allergies = "none", bool inviteOnly = true)
    

    少し時間を取って構文を確認してください。 パラメーターは引き続きコンマで区切られますが、パラメーター partySizeallergiesinviteOnly はそれぞれ値に割り当てられます。

    次に、RSVP の呼び出しを更新して、オプションのパラメーターを適用します。

  2. コードを次のように更新します。

    RSVP("Rebecca");
    RSVP("Nadia", 2, "Nuts");
    RSVP(name: "Linh", partySize: 2, inviteOnly: false);
    RSVP("Tony", allergies: "Jackfruit", inviteOnly: true);
    RSVP("Noor", 4, inviteOnly: false);
    RSVP("Jonte", 2, "Stone fruit", false);
    

    各メソッド呼び出しでは、名前が省略されていないことに注意してください。 メソッドを呼び出すときは、必要なすべての引数を常に含める必要があります。 ただし、省略可能な引数は省略できます。

    このコードでは、Rebecca の rsvp から 1, "none", true 引数を削除しました。 これらの引数は既定値と一致するため、Rebecca の rsvp の結果は同じです。

    ナディアの rsvp から inviteOnly 引数を削除しました。 inviteOnlyの既定値はtrueであるため、ナンディアの rsvp の結果は同じです。

    tony の rsvp から partySize 引数を削除しました。 Tony に招待があった場合は、RSVP で既定値の partySize が使用されます。

    Linh と Noor の rsvps の両方から allergies 引数を削除しました。 その rsvps には、"アレルギー" の既定値である none が表示されます。

  3. コードを保存して実行し、次の出力を確認します。

    Sorry, Tony is not on the guest list
    
    Total RSVPs:
    Name: Rebecca,  Party Size: 1,  Allergies: none
    Name: Nadia,    Party Size: 2,  Allergies: Nuts
    Name: Linh,     Party Size: 2,  Allergies: none
    Name: Noor,     Party Size: 4,  Allergies: none
    Name: Jonte,    Party Size: 2,  Allergies: Stone fruit
    

    partySizeallergiesなど、省略された引数の代わりに既定値が使用されていることに注意してください。

まとめ

これまでに省略可能な引数と名前付き引数について学習した内容を次に示します。

  • パラメーターは、メソッド シグネチャで既定値を設定することによって省略可能になります。
  • 名前付き引数にはパラメーター名を指定し、その後にコロンと引数の値を指定します。
  • 名前付き引数と位置指定引数を組み合わせる場合は、パラメーターの正しい順序を使用する必要があります。