Inspire - Capo Productions
var const final 区别
1. var
含义:由编译器自动推断类型的变量。
特点:
- 可以重新赋值。
- 一旦被第一次赋值,类型就确定了,不能再换成别的类型。
示例:
dartvar name = "Jack"; // 类型被推断为 String name = "Lucy"; // 可以 // name = 123; // 错误,已经被推断成 String
2. final
含义:运行时常量,赋值后不能再修改。
特点:
- 必须在 运行时 赋值一次。
- 之后不能再改。
示例:
dartfinal time = DateTime.now(); // 合法,运行时才能确定 // time = DateTime(2000); // 不能重新赋值
3. const
含义:编译时常量(compile-time constant)。
特点:
- 必须在 编译时 就能确定。
- 值不可变,并且对象是 canonicalized(相同值会复用同一个对象)。
示例:
dartconst pi = 3.14159; // 编译时常量 // const now = DateTime.now(); // 错误,编译时无法确定
4. 指定类型 (String、bool、int 等)
含义:显式声明变量类型。
特点:
- 与
var的区别在于:类型写死了,不会依赖推断。 - 一般在团队开发中,显式写类型更清晰。
- 与
示例:
dartString name = "Jack"; // 只能是 String bool isOk = true; // 只能是 bool int age = 18; // 只能是 int
5. 小结对比表
| 关键字/写法 | 可变性 | 类型确定时间 | 值确定时间 | 场景 |
|---|---|---|---|---|
var | 可变 | 第一次赋值时 | 运行时 | 一般变量声明 |
final | 不可变 | 第一次赋值时 | 运行时 | 运行时常量,比如 DateTime.now() |
const | 不可变 | 编译时 | 编译时 | 编译期常量,比如 pi、配置参数 |
显式类型 (String 等) | 可变或不可变取决于 var/final/const | 声明时 | 运行时/编译时取决于修饰符 | 强调类型约束 |
👉 你可以理解为:
- 是否能改:用
var(能改)、final/const(不能改)。 - 何时确定:
const(编译期)、final(运行时)。 - 类型写不写:写了更明确,不写用
var自动推断。