首页
/ freeCodeCamp《Create C Methods with Parameters》挑战解析:C 命名参数与可选参数实战

freeCodeCamp《Create C Methods with Parameters》挑战解析:C 命名参数与可选参数实战

2026-09-07 14:48:16作者:江焘钦

导读

在 freeCodeCamp 的 Foundational C#(Microsoft)认证学习路径中,《Create C# Methods with Parameters》是一道以微软 Learn 模块为学习载体、以选择题为验证手段的挑战:它要求开发者先在微软 Learn 平台完成“使用参数创建 C# 方法”模块,再回到 freeCodeCamp 回答一道关于**方法签名(method signature)、命名参数(named arguments)与可选参数(optional parameters)**的测验题。读完本文,你将完整掌握 C# 方法参数的定义规则、命名与可选参数的正确组合方式,并理解该挑战在 freeCodeCamp 课程结构中的定位、题目校验机制与逐项判定逻辑。

挑战在课程中的定位

freeCodeCamp 的课程内容以 curriculum/challenges/english/blocks/ 下的 Markdown 文件为事实来源,每个文件即一道 challenge。本挑战位于:

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

文件 frontmatter 中 title: Create C# Methods with ParameterschallengeType: 19。对照 packages/shared/src/config/challenge-types.tsmultipleChoice = 19,即这是一道内嵌单选题验证型挑战

从所属块(block)的结构文件 curriculum/structure/blocks/create-methods-in-c-sharp-console-applications.json 可以看出,本挑战属于“Create Methods in C# Console Applications”课程块,完整的挑战顺序为:

  1. Write Your First C# Method(647e226a8acb466c97ccbef1)
  2. Create C# Methods with Parameters(647e224b8acb466c97ccbeef,即本文主题)
  3. Create C# Methods that Return Values(647e223c8acb466c97ccbeee)
  4. Guided Project - Plan a Petting Zoo Visit(647e225e8acb466c97ccbef0)
  5. Challenge Project - Create a Mini-Game(647e22338acb466c97ccbeed)
  6. Trophy - Create Methods in C# Console Applications(647f877f07d29547b3bee1be)

该块帮助类目为 C-Sharp,采用 legacy-challenge-list 版式。整条课程线最终通向 curriculum/challenges/english/certifications/foundational-c-sharp-with-microsoft.yml 所定义的 Foundational C# with Microsoft 认证。原挑战说明也明确指出:完成微软 Learn 对应模块是赢取 “Create Methods in C# Console Applications” 奖杯、并具备参加认证考试资格的前提。

挑战的“混合式”学习流程

原挑战文件在 --description----assignment-- 中说明了这一模式:

  1. 前往微软 Learn 平台,完成 “Create C# Methods with Parameters” 模块的全部任务;
  2. 回到 freeCodeCamp,正确回答下方嵌入的选择题。

这意味着本挑战对学习过程(在 Learn 上完成编码练习)与理解结果(在 freeCodeCamp 上作答)做了分离,freeCodeCamp 侧承担的是知识验证与进度追踪职责。真正的方法参数知识仍需在 C# 代码中亲手实践,这也是下文展开技术内核的必要性所在。

核心知识:方法签名、可选参数与命名参数

从方法签名读起

题目给出如下方法签名:

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

对它的解析要分成三个层次:

  • void 返回类型:方法不返回任何值;
  • 形参(parameter)与实参(argument)namenumbermember 是形参,调用时填入的具体值是实参;
  • 必填参数与可选参数name 没有默认值,是必填参数number 默认 ""member 默认 false,都是可选参数

可选参数的定义规则

C# 中通过给形参赋默认值来声明可选参数,规则包括:

  • 默认值必须是编译期常量(如字符串、数字、布尔字面量),不能用运行时变量;
  • 可选参数必须排在所有必填参数之后
  • 调用时可以省略可选实参,省略部分将使用默认值。

例如 Print("Tony") 等价于 Print("Tony", "", false)——numbermember 都被自动补上默认值。

一个可运行的完整示例:

// 定义可选参数:number 与 member
void Print(string name, string number = "", bool member = false)
{
    string line = $"姓名:{name}";
    if (!string.IsNullOrEmpty(number)) line += $" | 号码:{number}";
    if (member) line += " | 会员:是";
    Console.WriteLine(line);
}

Print("Tony");               // 仅传必填参数
Print("Tony", "555");        // 按位置传入第二参数
Print("Tony", member: true); // 命名参数跳过中间可选参数

这里第三个调用正是题目正确选项的形态:由于 number 是中间的可选参数,若想跳过它直接设置 member位置实参无法“跳位”,必须借助命名参数按名传入。

命名参数的规则与价值

命名参数允许在调用时以 形参名: 值 的形式传参,带来两个核心能力:

  1. 跳过中间可选参数:直接为后面的参数赋值,例如 Print("Tony", member: true)
  2. 打乱实参顺序:例如 Print(member: true, name: "Tony") 与按位置调用等价。

需要注意的边界规则:

  • 命名参数必须放在按位置实参之后(C# 7.2 起,只要命名参数处于正确位置,其后仍可出现按位置实参);
  • 必填参数无论如何都不能省略——无论是按位置还是按名,只要某个必填形参没有得到实参,编译器就会报错;
  • 可选参数的默认值在编译期就被固化到调用点,属于“调用方视角的默认值”机制,与重载(overload)是不同的概念。

逐项拆解题目四个选项

题目问:在给定签名下,哪一项正确地使用了命名参数与可选参数?

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

选项 1:Print("Tony", member: true); ✅ 正确答案

  • "Tony" 按位置传给必填参数 name
  • member: true 按名传给第三个形参,从而合法跳过中间的 numbernumber 使用默认值 ""

该写法同时体现了“按位置传参”和“命名参数跳过可选参数”两种能力,编译器可正常通过,因此是唯一正确选项(文件末尾 --video-solution--: 1 指向的也正是这一项)。

选项 2:Print(number: "555", member: false)

两个实参都以命名形式给出,看似顺序也没问题,但它从未给必填参数 name 提供实参。C# 编译器会抛出 CS7036 错误:“There is no argument given that corresponds to the required formal parameter 'name'”。必填参数不可被命名参数“跳过”——能跳过的只有带默认值的可选参数。

选项 3:Print("Tony", false)

false 是布尔值,但它被按位置放在了第二个形参位,即 number(类型 string)的位置。位置映射不会智能地把 false 对到 member 上,编译器会抛出 CS1503 类型转换错误(无法将 bool 转换为 string)。要想只传 namemember,就必须使用命名参数(见选项 1),或写成 Print("Tony", "", false)

判定小结

调用形式 是否合法 原因
Print("Tony", member: true); 位置参数满足必填项,命名参数跳过可选项
Print(number: "555", member: false) 缺少必填参数 name(CS7036)
Print("Tony", false) 位置参数类型不匹配,bool 无法转为 string(CS1503)

挑战文件的题目格式与校验机制

freeCodeCamp 使用 ## --text--## --answers--## --video-solution-- 三部分组织这类嵌入题:--text-- 给出题干,--answers-- 内以 --- 分隔各候选项,--video-solution-- 记录正确答案的序号(从 1 起)。本挑战答案为 1,对应上面判定正确的选项 1。

这道题在存储与解析层面还要通过严格的 schema 校验。在 curriculum/schema/challenge-schema.js 中可以找到对应的 questionJoi 约束:每题必须有 text,必须有 answers 数组(且答案内容唯一、不能重复),而 solution 必须是 1 到 answers 数量之间的整数。也就是说,--answers-- 列了 3 个候选项,则 --video-solution-- 只能是 1、2 或 3,且必须与唯一正确答案一一对应,任何越界或缺失都会被校验工具拦截。

结合 packages/shared/src/config/challenge-types.tsmultipleChoice = 19,以及 schema 对 questions 字段按 challengeType 的按需校验(见 challenge-schema.js),可以看到:本挑战文件是 freeCodeCamp 课程数据管线中一个典型的“外部学习 + 本地测验”型节点,它的 Markdown 即数据,由统一的校验器保证格式正确、答案可判。

结合相邻挑战加深理解

在同一个课程块中,两道相邻挑战与本主题互为印证:

  • Guided Project - Plan a Petting Zoo Visit647e225e8acb466c97ccbef0.md)就“定义可选参数的目的”提问,正确答案为“当一个参数对结果不关键时,减少必填参数的数量”——这与本挑战中 numbermember 带默认值的思路完全一致;
  • Challenge Project - Create a Mini-Game647e22338acb466c97ccbeed.md)考察带返回值方法签名的设计,如 string GetValueAtIndex(string[] array, int index),提醒我们把“参数设计”与“返回类型设计”放在同一维度思考。

建议学习顺序是:先在微软 Learn 模块中亲手编写若干带可选/命名参数的方法并观察编译行为,再用本文的签名分析框架回看题目;若想实际验证,可在本地任意 .NET 控制台项目中把上文示例连同三个选项分别编译运行,观察 CS7036CS1503 两类编译错误,即可获得最直接的体感。

小结

本挑战用一个精简但极具代表性的方法签名 void Print(string name, string number = "", bool member = false),覆盖了 C# 参数体系的三大要点:必填与可选参数的划分命名参数跳过可选参数的写法位置实参不能跳位与类型必须匹配的约束。正确作答的关键在于两点:任何调用都不得遗漏必填参数;想要跨越中间的可选参数传值时,必须使用命名参数。掌握这套规则,不仅是通过这道 freeCodeCamp 挑战与后续认证考试的前提,也是日常写出清晰、健壮 C# API 的基础能力。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.76 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
860
1.35 K
docsdocs
暂无描述
Markdown
899
5.83 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
925
1.85 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.84 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
533
601
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.03 K
525
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.37 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
395