练习 - 具有可选参数的方法
C Sharp 语言允许使用命名参数和可选参数。 这些类型的参数允许你选择要提供给方法的参数,因此你不限于方法签名中定义的结构。
命名参数允许使用参数的名称而不是位置指定参数的值。 可选参数允许在调用该方法时省略这些参数。
在本练习中,你将了解如何同时使用命名参数和可选参数。
创建 RSVP 应用程序
在此任务中,你将创建一个简短的应用程序,供来宾回复出席邀请以确认参加活动。 来宾将提供他们的聚会规模和任何过敏。 你还可以添加一个选项,将 RSVP 限制为只能通过邀请进入的来宾名单。
在 Visual Studio Code 编辑器中,删除前面练习中的任何现有代码。
在 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 以分隔来宾信息。在
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关键字终止该方法。通过在方法签名上方
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();保存并运行代码以观察以下输出:
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
使用命名参数
调用接受多个参数的方法时,了解参数表示的内容可能比较棘手。 使用命名参数可以提高代码的可读性。 使用命名参数时,需指定参数名称,然后跟随参数值。 在此任务中,你将练习使用命名参数。
找到以下代码行:
RSVP("Linh", 2, "none", false);更新方法调用,如下所示:
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找到以下代码行:
RSVP("Tony", 1, "Jackfruit", true);更新方法调用,如下所示:
RSVP("Tony", inviteOnly: true, allergies: "Jackfruit", partySize: 1);请注意,命名参数不必按原始顺序显示。 但是,未命名参数
Tony是一个位置参数,并且必须出现在匹配的位置。保存并运行代码以观察以下输出:
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请注意,使用命名参数不会更改输出。
声明可选参数
为参数分配默认值时,参数变为可选。 如果从参数中省略可选参数,则当方法执行时将使用默认值。 在此步骤中,你将使partySize、allergies 和inviteOnly 参数变为可选。
若要定义可选参数,请按如下所示更新
RSVP方法签名:void RSVP(string name, int partySize = 1, string allergies = "none", bool inviteOnly = true)请花点时间观察语法。 参数仍用逗号分隔,但参数
partySizeallergies和inviteOnly每个参数都分配给一个值。接下来,您需要更新对
RSVP的调用,以应用可选参数。将代码更新为以下内容:
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。保存并运行代码以观察以下输出:
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请注意,默认值用于代替省略的参数,例如
partySize和allergies。
回顾
以下是您到目前为止所了解的关于可选参数和命名参数的内容:
- 通过在方法签名中设置默认值,参数是可选的。
- 命名参数使用参数名称指定,后跟冒号和参数值。
- 组合命名参数和位置参数时,必须使用正确的参数顺序。