Flutter

1. final 和 const(转)

2020-07-18  本文已影响0人  JohnSnow_b20c

转自Konie Shadow

如果你从不打算改变一个变量,请使用 finalconst,而不是 var 或者一个类型名。Final 变量只可以被设置一次;而 const 变量是编译期常量。(Const 变量是隐式 final 的。)一个 final 的顶级变量或者类变量在首次被使用时初始化。

说明:实例变量只可以是 final 的,不可以是 const 的。Final 实例变量必须在构造函数体开始前被初始化——在变量声明时、通过构造函数参数或者在构造函数的 初始化列表 中。

这里是创建并设置一个 final 变量的例子:

final name = 'Bob'; // 没有类型声明
final String nickname = 'Boddy';

你不可以改变一个 final 变量的值:

name = 'Alice'; // 错误:一个 final 变量只可以被设置一次

对那些你想要作为编译期常量的变量使用 const。如果这个 const 变量是类级别的,使用 static const 标识它。在你声明的时候,设置变量的值为编译期常量比如数字、字符串字面量、另一个常量或者常量数值的算术运算结果。

const bar = 1000000; // 压力单位(达因/cm2)
const double atm = 1.01325 * bar; // 标准大气压

Const 关键词不仅可以声明常量。你还可以使用它创建常量值,也可以声明创建常量值的构造函数。任何变量都可以拥有一个常量值。

var foo = const [];
final bar = const [];
const baz = []; // 等同于 `const []`

你可以忽略常量声明中初始化表达式中的 const,像上面的 baz 一样。详情请参阅 不要重复使用 const

你可以改变一个非 final 且非 const 变量的值,即使它有一个常量值。

foo = [1, 2, 3]; // 之前是 const []

你不可以改变一个常量的值:

baz = [42]; // 错误:常量不可以被赋值

编译时常量 && 运行时常量

编译时常量,就是它的值在编译时就能确定的常量,不是等到运行时才确定。
运行时常量,就是在它的值在程序运行时才能确定。
const是编译时常量,final就是运行时常量。
const修饰的常量必须在声明时初始化,并且是可以确定的值,不是需要经过计算的值。
final修饰的常量必须在声明进初始化或者在构造函数中初始化,它的值可以动态计算。
共同点是两者赋值后就不能再修改(不能重新赋值,对于引用类型可以修改属性)。

看一个Dart的常量实例:

main() {
  const test1="hello";//正确,编译期常量
  final test2="hello";//正确,运行时常量

  const test3=DateTime.now();//编译报错,值不是编译期常量
  final test4=DateTime.now();//正确,运行时常量

  const test5=new List();//编译报错,值不是编译期常量
  final test6=new List();//正确,运行时常量
}
上一篇下一篇

猜你喜欢

热点阅读