dart编程语言中static const和const的含义是什么?

aelbi1ox  于 2023-03-21  发布在  其他
关注(0)|答案(3)|浏览(155)

我在YouTube上看了在线教程,导师说示例变量可以是final,但不能是const,因此如果你想在类级别使用常量,那么就把它变成静态常量。我的问题是,当我们有const关键字时,为什么需要使用静态常量,而const关键字的工作是定义一个变量,该变量在整个变量中是常量。
视频链接:2点24分

dbf7pr2w

dbf7pr2w1#

根据this article
“static”、“final”和“const”在Dart中表示完全不同的事物:

**“static”**意味着一个成员可以在类本身而不是类的示例上使用。这就是它的全部含义,它不用于其他任何用途。static修饰 members
**“最终”**指单次转让:final变量或字段必须有一个初始化器。2一旦赋值,final变量的值就不能改变。3 final修改变量。
**“const”**在Dart中有一个更复杂和微妙的含义。const修改 values。您可以在创建集合(如const [1,2,3])和构造对象时使用它(而不是新的)类似const Point(2,3)。这里,const意味着对象的整个深层状态可以完全在编译时确定,并且对象将被冻结并且完全不可变。

ne5o7dgx

ne5o7dgx2#

我的问题是为什么需要使用静态常量,而我们有const关键字,其工作是定义一个变量,在整个变量中是常量。
我认为,在类中声明const字段时需要添加关键字static的主要原因是可读性,这样您就可以绝对肯定地理解,该变量在类的每个示例中都是相同的。
由于final变量在类的每个示例中被允许(并且经常是)具有不同的值,因此可能会发生混淆,因为final仅仅意味着“一旦被赋值,最终变量的值就不能被更改"。
因为const表示编译时常量,所以它对于类的所有示例都是一样的,也就是说它总是static,但是为了让开发人员完全明白这一点,我们需要编写static,即使编译器自己能计算出来。
不过再说一次,那只是我的猜测

tzdcorbm

tzdcorbm3#

假设成员上的const不需要static,并且您具有:

class Foo {
  const k = 42;
}

您如何访问它?
Foo.k应该法律的;因为值总是相同的,所以不需要首先构造Foo对象。
那么Foo().k呢?因为没有static关键字,它看起来也是法律的的。但是如果允许这样做,那么有很多情况需要考虑并定义行为:

Foo fooInstance = null;
print(fooInstance.k);
print(fooInstance?.k);

class Derived extends Foo {
  const k = 9;
}

fooInstance = Derived();
print(fooInstance.k);

对我来说,要求const成员也是static似乎更简单、更清楚。

相关问题