Skip to content

finalconst

相同点

  • 类型声明可以省略
  • 初始化后不能再重新赋值
  • 不能和var同时使用
dart
final a = 'hello';
final String b = 'world';
const c = 123;
const double d = 456.1;

final var e = 'test'; // IDE报错
a = 'haha'; // IDE报错,不能再重新赋值
c = 1.23; // IDE报错,不能再重新赋值

不同点

  • const初始化时需要一个真正意义上是确定的值
dart
final finalDt = DateTime.now();
const constDt = DateTime.now(); // 报错,因为在运行时获取到的值是动态的
  • 不可变性可传递
dart
final List fList = [1, 2, 3];
fList[0] = 9;
print(fList); // [9, 2, 3]

const List cList = [1, 2, 3];
cList[0] = 9; // 运行时报错, 因为const标记的列表中的每个值也是不能被修改的
print(cList);
  • final标记的多个相同值的变量各占一份内存空间的,而const标记的多个相同值的变量共用一份内存空间,类似 C 语言中的指针
dart
final a1 = [11, 22];
final a2 = [11, 22];

print(identical(a1, a2)); // false

const b1 = [11, 22];
const b2 = [11, 22];
print(identical(b1, b2)); // true

identical通过比较两个变量引用的是否是同一个内存地址(指针)来判断是否相等

MIT License