练习 - 具有可选参数的方法

已完成

C Sharp 语言允许使用命名参数和可选参数。 这些类型的参数允许你选择要提供给方法的参数,因此你不限于方法签名中定义的结构。

命名参数允许使用参数的名称而不是位置指定参数的值。 可选参数允许在调用该方法时省略这些参数。

在本练习中,你将了解如何同时使用命名参数和可选参数。

创建 RSVP 应用程序

在此任务中,你将创建一个简短的应用程序,供来宾回复出席邀请以确认参加活动。 来宾将提供他们的聚会规模和任何过敏。 你还可以添加一个选项,将 RSVP 限制为只能通过邀请进入的来宾名单。

  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 的结果相同。

    你从 Nadia 的 rsvp 中删除了 inviteOnly 该参数。 由于inviteOnly的默认值是true,因此Nadia的rsvp结果是相同的。

    你从 Tony 的 rsvp 中删除了 partySize 该参数。 如果 Tony 有邀请,则会在 RSVP 中使用默认值 partySize

    你从 Linh 和 Noor 的 rsvps 中删除了 allergies 该参数。 他们的 rsvp 将显示“过敏”的默认值 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

回顾

以下是您到目前为止所了解的关于可选参数和命名参数的内容:

  • 通过在方法签名中设置默认值,参数是可选的。
  • 命名参数使用参数名称指定,后跟冒号和参数值。
  • 组合命名参数和位置参数时,必须使用正确的参数顺序。