我在YouTube上看了在线教程,导师说示例变量可以是final,但不能是const,因此如果你想在类级别使用常量,那么就把它变成静态常量。我的问题是,当我们有const关键字时,为什么需要使用静态常量,而const关键字的工作是定义一个变量,该变量在整个变量中是常量。视频链接:2点24分
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意味着对象的整个深层状态可以完全在编译时确定,并且对象将被冻结并且完全不可变。
ne5o7dgx2#
我的问题是为什么需要使用静态常量,而我们有const关键字,其工作是定义一个变量,在整个变量中是常量。我认为,在类中声明const字段时需要添加关键字static的主要原因是可读性,这样您就可以绝对肯定地理解,该变量在类的每个示例中都是相同的。由于final变量在类的每个示例中被允许(并且经常是)具有不同的值,因此可能会发生混淆,因为final仅仅意味着“一旦被赋值,最终变量的值就不能被更改"。因为const表示编译时常量,所以它对于类的所有示例都是一样的,也就是说它总是static,但是为了让开发人员完全明白这一点,我们需要编写static,即使编译器自己能计算出来。不过再说一次,那只是我的猜测
const
static
final
tzdcorbm3#
假设成员上的const不需要static,并且您具有:
class Foo { const k = 42; }
您如何访问它?Foo.k应该法律的;因为值总是相同的,所以不需要首先构造Foo对象。那么Foo().k呢?因为没有static关键字,它看起来也是法律的的。但是如果允许这样做,那么有很多情况需要考虑并定义行为:
Foo.k
Foo
Foo().k
Foo fooInstance = null; print(fooInstance.k); print(fooInstance?.k); class Derived extends Foo { const k = 9; } fooInstance = Derived(); print(fooInstance.k);
对我来说,要求const成员也是static似乎更简单、更清楚。
3条答案
按热度按时间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意味着对象的整个深层状态可以完全在编译时确定,并且对象将被冻结并且完全不可变。
ne5o7dgx2#
我的问题是为什么需要使用静态常量,而我们有const关键字,其工作是定义一个变量,在整个变量中是常量。
我认为,在类中声明
const
字段时需要添加关键字static
的主要原因是可读性,这样您就可以绝对肯定地理解,该变量在类的每个示例中都是相同的。由于
final
变量在类的每个示例中被允许(并且经常是)具有不同的值,因此可能会发生混淆,因为final
仅仅意味着“一旦被赋值,最终变量的值就不能被更改"。因为
const
表示编译时常量,所以它对于类的所有示例都是一样的,也就是说它总是static
,但是为了让开发人员完全明白这一点,我们需要编写static
,即使编译器自己能计算出来。不过再说一次,那只是我的猜测
tzdcorbm3#
假设成员上的
const
不需要static
,并且您具有:您如何访问它?
Foo.k
应该法律的;因为值总是相同的,所以不需要首先构造Foo
对象。那么
Foo().k
呢?因为没有static
关键字,它看起来也是法律的的。但是如果允许这样做,那么有很多情况需要考虑并定义行为:对我来说,要求
const
成员也是static
似乎更简单、更清楚。