freeCodeCamp C 方法挑战通关指南:Guided Project “Plan a Petting Zoo Visit”与可选参数(Optional Parameters)深度解析
2026/9/8 16:41:58 网站建设 项目流程

freeCodeCamp C# 方法挑战通关指南:Guided Project “Plan a Petting Zoo Visit”与可选参数(Optional Parameters)深度解析

【免费下载链接】freeCodeCampfreeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp

本指南围绕 freeCodeCamp 课程中“Create Methods in C# Console Applications”(C# 控制台应用方法创建)系列的验证型关卡——Guided Project - Plan a Petting Zoo Visit 展开,完整还原其在 Microsoft Learn 平台上的完成流程、奖杯(Trophy)与认证考试关联关系,并以该关的校验题目为主线,深入讲解 C# 方法中可选参数(optional parameters)、命名实参(named arguments)的定义语法、适用场景及常见误区。读完本文,你既能顺利通过该关的答题验证,也能系统掌握“可选参数到底解决什么问题”这一核心考点。

关卡定位:课程中的验证性挑战

这一挑战文件位于仓库的 C# 学习块(block)目录中:

curriculum/challenges/english/blocks/create-methods-in-c-sharp-console-applications/647e225e8acb466c97ccbef0.md

从该文件 frontmatter 可以看到它的元数据:

--- id: 647e225e8acb466c97ccbef0 title: Guided Project - Plan a Petting Zoo Visit challengeType: 19 dashedName: guided-project-plan-a-petting-zoo-visit ---

其中challengeType: 19并非随意取值。在 packages/shared/src/config/challenge-types.ts 中,类型19被明确定义为multipleChoice(单选题/验证题),而18被定义为msTrophy(Microsoft 奖杯验证题)。也就是说,本关在技术上是一个带标准答案的多选题验证节点,用于确认学习者确实在外部平台上完成了对应的动手实践任务。而它的兄弟文件 647f877f07d29547b3bee1be.md(Trophy - Create Methods in C# Console Applications)使用challengeType: 18,承担最终的奖杯核验职责。

整个块内共包含 6 个相互关联的关卡文件:

文件标题(Title)challengeType
647e22338acb466c97ccbeed.mdChallenge Project - Create a Mini-Game19
647e223c8acb466c97ccbeee.mdCreate C# Methods that Return Values19
647e224b8acb466c97ccbeef.mdCreate C# Methods with Parameters19
647e225e8acb466c97ccbef0.mdGuided Project - Plan a Petting Zoo Visit19
647e226a8acb466c97ccbef1.mdWrite Your First C# Method19
647f877f07d29547b3bee1be.mdTrophy - Create Methods in C# Console Applications18

可以看出,本关是“方法与参数”主题下承上启下的综合实践关卡:前面先学“编写第一个方法”“方法参数”“返回值”,再通过“Petting Zoo Visit”引导式项目把方法、参数与返回值综合起来使用,最后以“Mini-Game”挑战项目收尾并领取奖杯。

挑战的完整完成流程

该文档明确说明了它属于“partially completed on the Microsoft Learn platform”(在 Microsoft Learn 平台上部分完成)的学习模式,即动手编码环节在微软官方训练平台完成,而 freeCodeCamp 负责出题验证学习成果。按照--description--的要求,通关需要严格执行以下两步:

  1. 前往 Microsoft Learn 完成全部任务:打开训练模块 “Guided Project - Plan a Petting Zoo Visit”,完成该模块中的全部任务(all the tasks)。这一步是强制性的(required),只有完成它,才能在 Microsoft Learn 上获得 “Create Methods in C# Console Applications” 奖杯(trophy),并取得参加对应认证考试的资格(qualify for the certification exam)。
  2. 回到 freeCodeCamp 正确作答:完成上述模块后,返回本挑战页面,正确回答下面的单选验证题即可通关。

--assignment--段与描述段保持一致的指令结构,唯一差别是文字更精炼:“Complete the Plan a Petting Zoo Visit guided project on Microsoft Learn. Then, answer the question below.”(在 Microsoft Learn 上完成该引导式项目,然后回答下方问题)。

需要特别提醒的是:freeCodeCamp 只校验你是否完成了外部实践并通过了选择题,并不会在本仓库中运行任何动物乐园相关代码。仓库与 Microsoft Learn 之间通过msTrophyId: learn.wwl.get-started-c-sharp-part-5.trophy(见 Trophy 关卡的 frontmatter)这类标识完成账号与学习成果的关联。因此在答题前,请务必确认自己在 Microsoft Learn 上确实把模块里每一步编码任务都做完了,否则即使答对题目,后续的奖杯验证环节(647f877f07d29547b3bee1be.md)也会因为没有可核验的奖杯而失败。

验证题目:可选参数的作用到底是什么

本关--questions--段给出了唯一的验证题目(--text--):

What is the purpose of defining an optional parameter in a method?

(在方法中定义可选参数的目的是什么?)

三个候选答案(--answers--)分别是:

  1. To cause a method to perform a different task.(让方法执行一个不同的任务。)
  2. To overload a method.(对方法进行重载。)
  3. To simplify the required parameters when a parameter isn't significant to the result.(当某个参数对结果影响不大时,简化必选参数。)

文件末尾的--video-solution--字段值为3,即正确答案是选项 3。这道题之所以是整门 C# 方法与参数课程的关键验收题,是因为它考察的是学习者对可选参数“设计动机”的理解——不是语法背诵,而是能否说清“为什么语言要提供这个特性”。

为什么正确答案是选项 3

可选参数的核心用途是:在不改变方法签名结构的前提下,让调用方可以省略那些“大多数情况下都有合理默认值、不影响主流程结果”的参数。它在语法层面对应的是“参数默认值”,语义层面对应的是“降低调用门槛”。官方课程同块中方法参数一关(647e224b8acb466c97ccbeef.md)给出的示例签名正体现了这一设计:

void Print(string name, string number = "", bool member = false)

在这条签名中,numbermember都声明了默认值,因此调用方只传name也能调用:

Print("Tony"); // 合法:number=""、member=false 被自动补齐 Print("Tony", member: true); // 合法:跳过 number,用命名实参指定 member

这里的member参数“对主流程结果不构成决定性影响”——大多数顾客不是会员,默认false完全合理。可选参数让Print方法面对“仅知道姓名”“知道姓名和号码”“姓名+号码+会员状态”三种调用场景都游刃有余,而不必为每种组合各写一个重载。

两个干扰项为什么错误

  • 选项 1(让方法执行不同任务):改变任务本质是“通过不同参数值走不同分支”甚至“重载不同实现”的职责,可选参数只是为缺失的参数填充默认值,它不会改变方法自身的语义目标,只是影响行为细节(例如默认显示空号码还是真实号码)。用选项 1 描述可选参数夸大了它的能力边界。
  • 选项 2(对方法进行重载):这是初学者最容易混淆的点。重载(overload)是“同一方法名下定义多个不同签名,由编译器在调用点按实参匹配”,属于编译期多态机制;可选参数则是“同一个签名内为尾部参数提供默认值”。两者经常互相替代(用可选参数减少重载数量),但可选参数本身并不是重载——本题问的是“定义可选参数的目的”,而它服务的目的正是减少必填参数带来的调用负担,对应选项 3。

可选参数语法与使用规则

结合课程块的方法参数关卡与本题,这里给出 C# 可选参数需要掌握的完整规则:

1. 声明语法:默认值即可选标记

void Print(string name, string number = "", bool member = false) // └── 必选(required) └── 可选 └── 可选

声明可选参数就是在参数名后以=赋予编译期常量。可选参数必须放在所有必选参数之后,否则编译器报错——这保证了“省略参数只能是尾部的连续省略”。

2. 调用语法:位置实参 + 命名实参

  • 位置实参(positional arguments):按声明顺序传值;
  • 命名实参(named arguments):用参数名: 值形式跳过中间可选参数,如Print("Tony", member: true),这是本关前序关卡明确考察的正确用法;
  • 注意:一旦使用命名实参,其后未命名实参必须按“位置实参必须位于命名实参之前”的约束排布(C# 7.2 起支持“位置实参跟在命名实参后”的严格顺序规则,前提是命名实参保持声明顺序)。

3. 可选参数的默认值要求

默认值必须是编译期可确定的常量:字面量、const字段、枚举成员等,不能依赖运行时变量。例如:

const int maxRetry = 3; void Retry(int times = maxRetry) { } // 合法:引用 const int GetCount() => 10; void Bad(int times = GetCount()) { } // 非法:方法调用不是编译期常量

4. 可选参数与重载的关系

同一个需求既可以用可选参数实现,也可以用一组重载实现。课程中学到的两种写法的等价关系有助于理解选项 3:

// 写法 A:可选参数 void Print(string name, string number = "", bool member = false) { } // 写法 B:等价的手写重载 void Print(string name) => Print(name, "", false); void Print(string name, string number) => Print(name, number, false); void Print(string name, string number, bool member) { }

可选参数的优势是签名集中、维护点少;代价是调用方式被编译器静态补齐,无法在运行时区分“调用者没传”与“调用者显式传了默认值”。当确实需要区分这两种情况时,Nullable<T>配合默认值null是更常见的进阶方案。

5. 常见陷阱

  • 默认值缺失导致“一次改动四处开花”:修改了默认值会影响所有未显式传参的调用点行为;
  • 版本演化时把“必选”改成“可选”会引入二义性重载(ambiguous call),把“可选”改成“必选”会破坏既有调用方;
  • ref/out/params与可选参数组合时,params数组必须位于最后,且可选参数之前不允许出现ref/out(需借助重载规避)。

与同块其他关卡的技能衔接

“Plan a Petting Zoo Visit”作为一个引导式项目,其动手内容需要综合运用同块前序关卡所学的全部技能:

  • 647e226a8acb466c97ccbef1.md(Write Your First C# Method):先掌握方法的声明语法,标准形式为void DisplayNumbers() { }——返回类型 + 方法名 + 参数列表 + 方法体,三者缺一不可。这是后续一切方法实践的地基;
  • 647e223c8acb466c97ccbeee.md(Create C# Methods that Return Values):掌握返回值的正确写法,例如返回字符串必须用return "";,而return 'a';(char)与return 5;(int)都会因类型不符而无法通过编译。在实现 Petting Zoo 的项目里,规划动物分组、生成访问名单等方法都需要返回string[]之类的数据;
  • 647e22338acb466c97ccbeed.md(Challenge Project - Create a Mini-Game):本关之后紧接的独立挑战项目。前序引导式项目会“带着你一步步实现”,而这里的挑战项目要求独立完成——这也是 C# Foundational 系列“引导项目 → 挑战项目 → 奖杯”的标准节奏。例如该关考察的签名设计string GetValueAtIndex(string[] array, int index)说明:返回数组中的字符串元素,返回值类型必须与元素类型一致bool或缩略参数列表都不是好选择。

也就是说,通关 “Plan a Petting Zoo Visit” 的意义不仅是拿到一个奖杯,更是为紧接着的 Mini-Game 挑战项目做好实战演练。

通关核对清单

为避免“答对题却拿不到奖杯”的尴尬情况,按本关描述与 Trophy 关卡要求整理如下:

  1. 在 Microsoft Learn 上打开 “Guided Project - Plan a Petting Zoo Visit” 模块,逐任务完成全部编码步骤,不跳过任何 “Check your work” 验证环节;
  2. 确认 Microsoft Learn 的成就页(achievements)中已出现 “Create Methods in C# Console Applications” 奖杯;
  3. 回到本 freeCodeCamp 挑战页,回答验证题:可选参数的目的 = “当某参数对结果不显著时简化必填参数”(选项 3);
  4. 继续完成后续的 Challenge Project - Create a Mini-Game 验证题;
  5. 在最终 Trophy 关卡(647f877f07d29547b3bee1be.md)中,将 Microsoft 用户名与 freeCodeCamp 账号关联,点击 “Verify Trophy” 完成奖杯核验,从而取得认证考试资格。

仓库中的相关实现与结构依据

如果想要在源码层面进一步理解本关的工作原理,可以参考以下文件:

  • 本挑战 Markdown 源文件:challengeType: 19--description--/--assignment--/--questions--/--answers--/--video-solution--的分段格式即 freeCodeCamp 验证题的标准结构;
  • challenge 类型定义:常量multipleChoice = 19msTrophy = 18的映射关系,以及hasNoSolution对这两类关卡“无传统解法代码”的判定逻辑,解释了为何验证题不需要提交代码而只需选择答案;
  • 挑战结构校验 schema:该文件用于校验每个 challenge Markdown 是否符合仓库规定的结构约束(如问题与答案块的组织),是保证上面分段格式能正确渲染的底层依据;
  • 同块 Trophy 文件 647f877f07d29547b3bee1be.md:msTrophyId字段把本块学习成果与 Microsoft Learn 成就体系绑定。

综上,本关的实质是“外部动手 + 站内验证”的双平台关卡。把握住可选参数“为非关键参数提供默认值、从而简化必选参数集合”这一核心语义,你就能稳过验证题,并在后续的 Mini-Game 挑战项目与认证考试中举一反三。

【免费下载链接】freeCodeCampfreeCodeCamp.org's open-source codebase and curriculum. Learn math, programming, and computer science for free.项目地址: https://gitcode.com/GitHub_Trending/fr/freeCodeCamp

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询