type
status
date
slug
summary
tags
category
icon
password
<ins/>
在 Dart 中,
final
和 const
都用于定义不可变的变量,但它们在使用场景和不可变的特性上有所不同。1. final
- 定义后不可变:
final
变量在定义后只能被赋值一次,但赋值本身可以是延迟的。final
变量的值在运行时确定。
- 运行时初始化:
final
变量可以在运行时赋值。只要在赋值之后不再更改其值即可。
- 适用于单次初始化的变量:通常用于那些不需要在编译时就确定值的变量,例如依赖运行时计算或从外部获取的数据。
示例
在上面的例子中,
currentTime
和 age
的值是在运行时决定的,并且在赋值后就不可更改。2. const
- 编译时常量:
const
变量必须在编译时就确定其值,也就是说,const
变量的值在编译时就固定下来。
- 不可变对象:
const
变量不仅自身是不可变的,其引用的对象也是不可变的。
- 更高的性能:由于
const
变量在编译时就确定了值,它们通常会被 Dart 直接内联到代码中,从而提高性能。
- 常量构造函数:
const
可以用于创建编译时的常量对象,使用const
构造函数来生成不可变的对象实例。
示例
在上面的例子中,
maxItems
、pi
和 point
的值在编译时已经确定下来,且不可变。final
和 const
的主要区别
特性 | final | const |
初始化时间 | 运行时确定 | 编译时确定 |
可变性 | 定义后不可变,但在运行时初始化 | 定义后不可变,且必须在编译时初始化 |
是否完全不可变 | 对象本身可变,引用不可变 | 对象和引用都不可变 |
适用场景 | 需要延迟初始化的不可变变量,运行时确定的值 | 编译时可确定的值和需要完全不可变的对象 |
总结
final
:适用于那些不需要在编译时就确定的不可变变量。它可以在运行时赋值,并且只能被赋值一次。
const
:用于那些在编译时就可以确定的不可变变量和完全不可变的对象。
<ins/>