https://www.dartlang.org/guides/language/language-tour#final-and-const
在Dart文档的语言之旅中,它说:“注意:实例变量可以是最终变量,但不能是const。最终实例变量必须在构造函数主体开始之前进行初始化-在变量声明中,通过构造函数参数或在构造函数的内部初始化列表。”
但是可以使用常量构造函数来创建常量对象。为什么在Dart中无法将常量变量声明为成员变量?
答案 0 :(得分:3)
const
表示编译时常量。
如果您需要在运行时创建实例来创建值,则它不再是编译时常量,因此其成员也不能为const
。
静态成员不需要创建实例,因此无论该类是否具有const构造函数或是否与const
一起使用都可以是常量。
答案 1 :(得分:2)
您可以在类中包含常量,但不会将它们归类为实例变量。关键取决于final和const之间的区别,因为常量不是变量,所以不能拥有const实例变量。
尽管类中的常量必须是静态的,所以您可以编写如下内容:
class MyClass {
static const kMyConstant = 100;
void talk() {
print('My constant is $kMyConstant');
}
}
这在飞镖中是完全有效的。
答案 2 :(得分:0)
为什么不能将常量变量声明为成员 Dart中的变量?
首先让我们定义成员或实例变量是什么。实例变量基本上是定义对象属性的事物。因此,像Car
这样的Car(name: "Mercedeces", price: 500000)
类的对象将具有与Car(name: "Toyota", price: 10000)
不同的成员属性值。
现在将实例变量设置为final
基本上意味着,一旦定义了名称为Car
的{{1}}对象,您就绝对不能在运行时更改该对象的名称。您假设需要一个名称为Mercedes
的{{1}},所以要新建一个对象。在将实例属性设置为Car
时,这很有意义。
现在,让我们看一下BMW
。 final
是编译时间常数。假设允许您将const
的{{1}}实例变量定义为const
。这样做基本上意味着,无论您创建name
对象的实例有多少,所有名称都是相同的,就像Car
成员一样,您不能更改它。 第一部分听起来很奇怪。并非所有汽车都具有相同的const
,这与类的实例或对象的含义相矛盾。使用Car
的对象属性可能是不可变的,但绝对不会具有相同的值。您可能希望能够有时创建final
和有时name
的实例。因此,将实例属性设置为final
是没有意义的。这就是为什么dart在没有静态关键字的情况下不允许Mercedes
的原因。您需要在类内BMW
属性旁边的const
关键字,因为只有这样,它才符合实例属性的定义。
答案 3 :(得分:0)
简单来说,因为如果您想要const
,那么它必须在编译时完成,所以要么:
const
:这是由const
构造函数完成的。const
。您仅标记了一个字段const
是没有意义的。
例如const
的意思是“只有一个”:您可以使用Car
类创建许多Car
实例,然后说您的wheel
是const
,因此您在所有wheel
中共享一个Car
?
但是您可以使Car teslaCar = Car.fromModel(type: "Tesla")
获得唯一的编译时模型const Car
。