const
const 用在 = 左邊
當 const
用在 =
左邊,其作用是聲明變量,它要求必須在聲明變量時賦值徐钠,一旦賦值就不允許修改篱竭,而聲明值一定要是編譯時常量力图。
編譯時常量的幾種場景:
- 數(shù)字、字符串掺逼、其他的
const
變量
void main() {
const a = 1;
const b = 'hello';
const c = a;
}
- 表達式吃媒,表達式的所有值都是編譯時可知的
void main() {
const a = 1;
const b = a > 1 ? 2 : 1;
}
- 集合或?qū)ο螅媳仨氂?
const
修飾,對象的構(gòu)造函數(shù)必須用const
修飾
void main() {
const a = const [1,2,3];
const b = ConstObject(2);
b.log();
}
class ConstObject {
final value;
const ConstObject(this.value);
log() {
print(value);
}
}
const 用在 = 右邊
當 const
用在 =
右邊赘那,其作用是修飾值刑桑,它意味著對象的整個深度狀態(tài)可以在編譯時完全確定,并且對象被凍結(jié)并且完全不可變募舟。
一般用于修飾集合祠斧,它要求兩點
- 集合的元素必須是遞歸的編譯時常量
void main() {
var c = 2;
// 報錯,集合元素必須是編譯時常量
var a = const [c, 2, 3];
}
- 不允許對集合做任何改變
void main() {
const a = const [1,2,3];
// 報錯拱礁,不允許修改
a[1] = 2;
}
const 修飾類的構(gòu)造函數(shù)
當 const
修飾類的構(gòu)造函數(shù)時琢锋,它要求該類的所有成員都必須是 final
的
class ConstObject {
final value;
// 報錯,必須是 final 變量
int value2;
const ConstObject(this.value);
log() {
print(value);
}
}
final
final
的要求就是其聲明的變量在賦值之后就不再改變呢灶,它并不要求 =
右邊是編譯時常量吩蔑。
final
有兩種使用場景:
- 文件中的變量聲明:必須在聲明時賦值;
- 類的成員變量聲明:可以在聲明時賦值填抬,也可以通過構(gòu)造函數(shù)賦值語法糖
ClassV({this.a})
烛芬,或者初始化列表的方式賦值;