You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dart中Record类型解析:定义、用法、集合差异及‘真实值’含义

Dart Record 常见问题解答

1. 什么是Record类型,如何使用,适合哪些场景?

Record是Dart中用于打包多个异构值的匿名复合类型,无需提前定义类就能组合不同类型的数据,属于值类型且不可变。

使用方式

  • 位置记录:用括号包裹多个值,通过位置索引访问
    // 定义包含字符串和整数的位置记录
    var userInfo = ('Alice', 28);
    // 通过$0、$1索引访问字段
    print(userInfo.$0); // 输出 Alice
    print(userInfo.$1); // 输出 28
    
  • 命名记录:给每个字段指定名称,通过名称访问,可读性更强
    var product = (name: 'Laptop', price: 999.99, inStock: true);
    print(product.name); // 输出 Laptop
    print(product.price); // 输出 999.99
    
  • 也可混合位置与命名字段(不推荐,易降低可读性):
    var mixed = ('admin', id: 1, isActive: true);
    print(mixed.$0); // admin
    print(mixed.id); // 1
    

适用场景

  • 函数返回多个值:无需为返回值单独定义类,比如同时返回计算结果和状态
    (int sum, bool isSuccess) calculate(List<int> nums) {
      if (nums.isEmpty) return (0, false);
      return (nums.reduce((a,b)=>a+b), true);
    }
    
  • 临时组合异构数据:处理API响应时,仅提取部分字段临时使用,无需定义完整Model类
  • 集合中存储结构化数据:需要存储的每条数据结构固定但不想定义类时,Record比Map更类型安全
  • 简化多参数传递:回调函数中传递多个相关值,比单独传多个参数更规整

2. Record与Map、List等集合类型的区别

维度RecordListMap
结构与类型安全固定字段数量,编译时确定类型,访问时严格类型检查有序序列,元素可异构但通常同构,访问需手动处理类型键值对结构,键值类型灵活,但访问需处理键不存在或类型不匹配问题
可变性完全不可变,创建后无法修改字段值默认可变(可通过List.unmodifiable创建不可变列表)默认可变(可通过Map.unmodifiable创建不可变映射)
相等性判断结构(字段数量、类型、名称)和值都相同则相等(值语义)长度、每个位置元素都相同则相等键值对完全匹配则相等
访问方式位置索引($0/$1)或命名字段索引下标键名
使用成本无需提前定义,直接使用无需定义,适合同构数据序列无需定义,适合动态键值对场景

核心差异总结:

  • Record适合固定结构的异构数据,比Map更类型安全,比自定义类更轻便;
  • List适合有序的同构数据序列,而Record是固定数量的复合值;
  • Map适合动态键值对(键不确定的场景),而Record的结构编译时固定。

3. “records are real values”具体指什么?

这句话强调Record是Dart中的一等值类型,和int、String等基础类型拥有完全相同的特性:

  • 可赋值给变量、作为函数参数传递、作为函数返回值;
  • 可放入集合(List、Map等)中作为元素或键;
  • 支持值语义相等性:两个结构一致且字段值相同的Record,无论创建方式如何,==比较结果为true;
  • 拥有稳定的hashCode,可安全作为Map的键;
  • 不可变性:创建后字段值无法修改,确保数据一致性。

简言之,Record不是语法糖或临时结构,而是和基础类型一样的真实值,能参与任何值可进行的操作。

内容的提问来源于stack exchange,提问作者innocent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 17:08:09