Dart:为什么常量不能成为实例变量?

时间:2019-04-02 07:56:40

标签: dart flutter

https://www.dartlang.org/guides/language/language-tour#final-and-const

在Dart文档的语言之旅中,它说:“注意:实例变量可以是最终变量,但不能是const。最终实例变量必须在构造函数主体开始之前进行初始化-在变量声明中,通过构造函数参数或在构造函数的内部初始化列表。”

但是可以使用常量构造函数来创建常量对象。为什么在Dart中无法将常量变量声明为成员变量?

4 个答案:

答案 0 :(得分:3)

const表示编译时常量。
如果您需要在运行时创建实例来创建值,则它不再是编译时常量,因此其成员也不能为const

静态成员不需要创建实例,因此无论该类是否具有const构造函数或是否与const一起使用都可以是常量。

答案 1 :(得分:2)

您可以在类中包含常量,但不会将它们归类为实例变量。关键取决于final和const之间的区别,因为常量不是变量,所以不能拥有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时,这很有意义。

现在,让我们看一下BMWfinal是编译时间常数。假设允许您将const的{​​{1}}实例变量定义为const。这样做基本上意味着,无论您创建name对象的实例有多少,所有名称都是相同的,就像Car成员一样,您不能更改它。 第一部分听起来很奇怪。并非所有汽车都具有相同的const,这与类的实例或对象的含义相矛盾。使用Car的对象属性可能是不可变的,但绝对不会具有相同的值。您可能希望能够有时创建final和有时name的实例。因此,将实例属性设置为final是没有意义的。这就是为什么dart在没有静态关键字的情况下不允许Mercedes的原因。您需要在类内BMW属性旁边的const关键字,因为只有这样,它才符合实例属性的定义。

答案 3 :(得分:0)

简单来说,因为如果您想要const,那么它必须在编译时完成,所以要么:

  1. 整个实例为const:这是由const构造函数完成的。
  2. 整个实例不是const

您仅标记了一个字段const是没有意义的。

例如const的意思是“只有一个”:您可以使用Car类创建许多Car实例,然后说您的wheelconst,因此您在所有wheel中共享一个Car

但是您可以使Car teslaCar = Car.fromModel(type: "Tesla")获得唯一的编译时模型const Car

相关问题