有人可以向我解释如何/何时/为何使用const
关键字,或者它只是“一种声明常量变量的方法”?如果是这样,它之间的区别是什么:
int x = 5;
和
const int x = 5;
请你们举个例子吗?
答案 0 :(得分:16)
const
表示编译时间常量。必须在编译时知道表达式值。 const
修改了“值”。
“const”的含义在Dart中有点复杂和微妙。 const修改值。您可以在创建集合时使用它, 像const [1,2,3],以及构造对象(而不是new) 像const Point(2,3)。这里,const意味着对象的整体 深度状态可以完全在编译时确定 对象将被冻结并完全不可变。
如果您使用
const x = 5
然后变量x可以用在像
const aConstCollection = const [x];
如果您不使用const
,只需使用x = 5
然后
const aConstCollection = const [x];
是非法的。
class SomeClass {
static final someConstant = 123;
static final aConstList = const [someConstant]; //NOT allowed
}
class SomeClass {
static const someConstant = 123; // OK
static final startTime = new DateTime.now(); // OK too
static const aConstList = const [someConstant]; // also OK
}
答案 1 :(得分:2)
以下是有关const
值的一些事实:
必须在编译时知道该值。
const x = 5; // OK
在运行时计算的任何内容都不能为const
。
const x = 5.toDouble(); // Not OK
const
值表示它是深恒定的,也就是说,它的每个成员都是递归恒定的。
const x = [5.0, 5.0]; // OK
const x = [5.0, 5.toDouble()]; // Not OK
您可以创建const
构造函数。这意味着可以从类中创建const
值。
class MyConstClass {
final int x;
const MyConstClass(this.x);
}
const myValue = MyConstClass(5); // OK
const
值是规范实例。这意味着无论您声明多少实例,都只有一个实例。
main() {
const a = MyConstClass(5);
const b = MyConstClass(5);
print(a == b); // true
}
class MyConstClass {
final int x;
const MyConstClass(this.x);
}
如果您的班级成员为const
,则还必须将其标记为static
。 static
表示它属于该类。由于只有const
值的一个实例,所以没有static
就没有意义。
class MyConstClass {
static const x = 5;
}