dart 中的位置参数和命名参数的区别?

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,
);
}

相关推荐
蜡台5 分钟前
Uniapp H5Builderx 预览Html 显示404问题解决
前端·uni-app
We་ct11 分钟前
LeetCode 190. 颠倒二进制位:两种解法详解
前端·算法·leetcode·typescript
踩着两条虫21 分钟前
AI驱动的Vue3应用开发平台深入探究(二十五):API与参考之Renderer API 参考
前端·javascript·vue.js·人工智能·低代码·前端框架·ai编程
信创DevOps先锋29 分钟前
本土化突围:Gitee如何重新定义企业级项目管理工具价值
前端·gitee·jquery
圣光SG41 分钟前
Java类与对象及面向对象基础核心详细笔记
java·前端·数据库
yeziyfx42 分钟前
Flutter UI图标点击事件
flutter
Jinuss1 小时前
源码分析之React中的useImperativeHandle
开发语言·前端·javascript
ZC跨境爬虫1 小时前
CSS核心知识点与定位实战全解析(结合Playwright爬虫案例)
前端·css·爬虫
Jinuss1 小时前
源码分析之React中的forwardRef解读
前端·javascript·react.js
mengsi551 小时前
Antigravity IDE 在浏览器上 verify 成功但本地 IDE 没反应 “开启Tun依然无济于事” —— 解决方案
前端·ide·chrome·antigravity