Dart 入门学习(3)—— const 和 final

本文详细解析了Dart语言中变量与常量的使用规则,包括final与const的区别,以及如何正确初始化变量和常量。通过示例代码展示了final变量与const常量在赋值上的不同限制,并解释了在数组和字符串操作中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文参考如下网址

http://www.cndartlang.com/658.html

http://dart.goodev.org/guides/language/language-tour

注意标红部分与参考网页上有些许区别

 

void main() {

  final name = 'Bob'; // 正确
//  name = 'Alice'; // 错误,final 变量只能赋值一次

//  const name1;  // 错误,const 变量是编译时常量,需要在声明时赋值进行初始化
//  final name1; // 错误,final变量需要在声明时赋值进行初始化
  const name2 = 'Alice';  // 正确

//  const name3 = name; // 错误,name 是个变量,不能赋给const
   final name4 = name2; // 正确,可以把const 常量赋给 final 变量

//  final names1 = const[name, 3, 4];  // 错误,name 是个变量,不能赋给const
    final names2 = const[name2, 'Allen', 'Brian'];

  const names3 = ['A', 'B', 'C'];  // 正确。这里与参考 http://www.cndartlang.com/658.html 有点差别,经实测是正确的
  const names4 = const['A','B', 'C']; // 正确。

  print(names3[1]);
  print(names4[1]);
}
### Dart 中 `const` `final` 的区别 #### 定义与作用范围 - **`final` 关键字** 使用 `final` 声明的变量在其生命周期内只能被赋值一次,无论是在声明时还是之后。一旦赋值完成,该变量的值便不可更改[^3]。这意味着 `final` 变量可以在运行时动态计算得出其值。 - **`const` 关键字** 使用 `const` 声明的是编译时常量,它不仅限于简单的数值类型,还可以表示复杂的对象结构(如列表、映射)。`const` 表达式的值必须在编译期就已知并固定下来,因此无法在运行时重新分配或修改[^2]。 #### 不可变性差异 - 对于 `final` 来说,虽然它可以指向一个不可变的对象(比如通过 `const` 构造出来的实例),但它本身并不强制要求所指代的内容一定是不可变的。换句话说,如果 `final` 绑定到一个可变集合上,则这个集合内部的数据仍然允许变化[^1]。 ```dart final List<int> numbers = [1, 2]; numbers.add(3); // 合法操作,numbers 列表内容发生了改变 ``` - 而对于 `const` ,由于它是真正的常量定义方式之一,所以由 `const` 初始化创建出来的东西总是完全不可变的,无论是原始数据类型还是复杂的数据结构都如此。 ```dart const List<int> constants = [4, 5]; // constants.add(6); // 错误:尝试向恒定列表添加新元素 ``` #### 性能考量 当多个地方需要用到相同的常数或者相同配置好的对象时,采用 `const` 更加高效,因为它会在整个应用程序范围内共享同一个内存地址副本而不是每次单独生成新的实体。而相比之下,即使两个不同位置上的 `final` 成员具有相等的实际内容,它们也各自独立存在互不影响。 ```dart void main() { final listA = [&#39;apple&#39;, &#39;banana&#39;]; final listB = [&#39;apple&#39;, &#39;banana&#39;]; print(identical(listA, listB)); // false const setA = {&#39;red&#39;, &#39;blue&#39;}; const setB = {&#39;red&#39;, &#39;blue&#39;}; print(identical(setA, setB)); // true } ``` --- ### 示例代码对比 以下是关于如何正确运用这两个关键词的一些例子: ```dart // 正确使用 final final String greetingMessage; greetingMessage = "Hello world!"; print(greetingMessage); // 尝试再次给 final 变量赋值会报错 // greetingMessage = "Goodbye"; // 正确使用 const const int daysInWeek = 7; // 下面这段不会执行成功,因为 const 必须立即初始化 /* const double piValue; piValue = 3.14159; */ // 复杂类型的比较 final Map<String, dynamic> userFinal = {"name": "Alice", "age": 25}; userFinal["city"] = "New York"; const Map<String, dynamic> userConst = {"name": "Bob", "age": 30}; // userConst["hobby"] = "Reading"; // 运行错误,试图更新 const 地图 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员imHou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值