1. 位置参数(Positional Parameters)
定义
位置参数是按 参数在函数定义中的顺序 传递的参数。调用函数时,必须按顺序传递参数,且参数名在调用时不需要指定。
分类
- 必选位置参数:必须传递,且顺序固定。
- 可选位置参数 :用
[]
包裹,可以不传或传部分参数。
示例
dart
// 定义函数:两个必选参数,一个可选参数
void printInfo(String name, int age, [String? city]) {
print('Name: $name, Age: $age');
if (city != null) {
print('City: $city');
}
}
void main() {
// 必须按顺序传递必选参数
printInfo('Alice', 30); // 只传必选参数,可选参数不传
printInfo('Bob', 25, 'New York'); // 传必选参数和可选参数
}
输出
yaml
Name: Alice, Age: 30
Name: Bob, Age: 25
City: New York
关键点
- 必选参数必须放在可选参数前面。
- 可选参数默认值 :可以在定义时设置默认值,如
int age = 18
,这样不传时会用默认值。
2. 命名参数(Named Parameters)
定义
命名参数通过 参数名 传递值,调用时通过 参数名: 值
的形式指定,顺序无关,且通常是可选的。
分类
- 可选命名参数 :用
{}
包裹,调用时可选。 - 必选命名参数 :需用
required
标记(Dart 2.12+)。
示例
dart
// 定义函数:两个命名参数,其中 name 是必选(required)
void printProfile({required String name, String? job, int? age}) {
print('Name: $name');
if (job != null) {
print('Job: $job');
}
if (age != null) {
print('Age: $age');
}
}
void main() {
// 必须传递必选参数 name,其他可选
printProfile(name: 'Charlie'); // 只传必选参数
printProfile(name: 'David', age: 30, job: 'Engineer'); // 任意顺序
printProfile(job: 'Artist', name: 'Eve'); // 参数顺序无关
}
输出
makefile
Name: Charlie
Name: David
Job: Engineer
Age: 30
Name: Eve
Job: Artist
关键点
- 命名参数默认可选 ,但用
required
标记的参数必须传递。 - 调用时必须指定参数名,顺序无关。
对比总结
特性 | 位置参数 | 命名参数 |
---|---|---|
传递方式 | 按顺序,无需参数名 | 通过参数名,顺序无关 |
必选参数 | 必须按顺序传递 | 必须用 required 标记 |
可选参数 | 用 [] 包裹,顺序固定 |
用 {} 包裹,无需固定顺序 |
可读性 | 参数多时易混淆 | 参数多时更清晰(通过参数名) |
默认值 | 可设置默认值 | 可设置默认值 |
使用场景
- 位置参数 :参数少且顺序明确时(如
add(1, 2)
)。 - 命名参数:参数多、可选参数多或需要清晰标识时(如 UI 组件配置)。
常见问题
Q1:为什么可选参数必须放在必选参数后面?
- 因为 Dart 需要明确必选参数的顺序,可选参数是"补充"信息,放在最后更合理。
Q2:如何为命名参数设置默认值?
dart
void greet({String name = 'Guest'}) {
print('Hello, $name!');
}
greet(); // 输出:Hello, Guest!
Q3:能否同时使用位置参数和命名参数?
- 可以,但需遵循规则:
dart
void printDetails(String name,int? age,String? city) {
print('Name: $name');
if (age != null) {
print('Age: $age');
}
if (city != null) {
print('City: $city');
}
}
代码示例(综合)
dart
// 综合使用位置参数和命名参数
void printUser({
required String name, // 必填参数需标记 required
String? job, // 可选命名参数
int? age,
bool? isStudent,
}) {
print('Name: $name');
if (job != null) {
print('Job: $job');
}
if (age != null) {
print('Age: $age');
}
if (isStudent != null) {
print('Is Student: $isStudent');
}
}
void main() {
printUser(name: 'Alice'); // 输出:Name: Alice
printUser(name: 'Bob', job: 'Engineer'); // 输出:Name: Bob, Job: Engineer
printUser(
name: 'Charlie',
job: 'Developer',
age: 28,
isStudent: false,
);
}