void main() {
simpleUse();
finalUse();
constUse();
}
simpleUse() {
print("\nsimple declaration");
var x = [10];
print('before: $x');
x = [5];//changing reference allowed
x.add(10);//changing content allowed
print('after: $x');
}
finalUse() {
print("\nfinal declaration");
final x = [10];
print('before: $x');
// x = [10,20]; //nope changing reference is not allowed for final declaration
x.add(20); //changing content is allowed
print('after: $x');
}
constUse() {
print("\nconst declaration");
const x = [10];
print('before: $x');
// x = [10,20]; //nope -> changing reference is not allowed for final declaration
// x.add(20);//nope -> changing content is not allowed
print('after: $x');
}
3条答案
按热度按时间laawzig21#
这是一个简单的例子,我希望能解释清楚:
从两个变量和一个常量开始。
尝试修改
foo
并成功。尝试类似地修改
bar
,会出现错误,因为即使bar
是一个变量,它的 value 也被声明为常量,因此是不可变的。尝试为
bar
重新分配一个不同的值。这是可行的,因为bar
本身没有声明为常量。现在,尝试再次修改
bar
的值,这一次它可以工作,因为它的新值不是常量。尝试修改
baz
会出现错误,因为baz
本身被声明为常量,其值本质上是不可变的。尝试将
baz
重新分配为新值,但失败了,因为baz
是一个常量,不能重新分配为新值。qvtsj1bj2#
此外,变量是简单值,如
x = 10;
值是枚举、列表、Map、类等的示例。
vd8tlhqk3#
我想补充的是,
const
的另一点是保证每次使用相同的参数构造对象时,都能获得相同的对象示例:这就是为什么
const
构造函数很难为所有对象创建的原因,因为你需要确保对象可以在编译时构造。同样,为什么在创建对象之后,内部状态不能改变,正如前面的答案所示。