【问题标题】:What is the meaning of static const and const in dart programming language?dart编程语言中的static const和const是什么意思?
【发布时间】:2020-07-07 20:07:59
【问题描述】:

我在 YouTube 上观看在线教程,导师说实例变量可以是 final 但不能是 const,因此如果你想要一个类级别的常量,然后将其设为静态 const。我的问题是,当我们有 const 关键字的工作是定义一个在整个变量中保持不变的变量时,有什么需要使用 static const。

视频链接:https://www.youtube.com/watch?v=IYZqVOH6oSU 2:24

【问题讨论】:

    标签: android dart


    【解决方案1】:

    根据this article

    “static”、“final”和“const”在 Dart 中表示完全不同的东西:

    “静态” 表示成员在类本身而不是在 类的实例。这就是它的全部含义,它不用于 还要别的吗。 static 修改成员

    "final" 表示单一赋值:一个 final 变量或字段必须有 一个初始化器。一旦分配了一个值,最终变量的值就不能 被改变。 final 修改变量

    “const” 在 Dart 中具有更复杂和微妙的含义。 const 修改。您可以在创建集合时使用它, 像 const [1, 2, 3],以及在构造对象时(而不是 new) 像 const Point(2, 3)。这里, const 表示对象的全部 深度状态可以完全在编译时确定,并且 对象将被冻结并完全不可变。

    【讨论】:

      【解决方案2】:

      我的问题是,当我们有 const 关键字,其工作是定义一个在整个变量中保持不变的变量时,有什么需要使用 static const。

      我认为在类中声明 const 字段时需要添加关键字 static 的主要原因是可读性,因此您绝对确定您了解该变量在类的每个实例中都是相同的。

      由于final 变量被允许(并且通常是)在类的每个实例中具有不同的值,因此可能会发生混淆,因为final 仅表示“一旦分配了值,最终变量的值就不能更改。”。

      由于const 是编译时间常数,它对于类的所有实例将始终保持不变,这意味着它将始终为static。但是为了让开发者完全清楚,我们需要写static,即使编译器可以自己解决。

      不过,这只是我的猜测。 :)

      【讨论】:

        【解决方案3】:

        假设成员上的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 似乎更简单明了。

        【讨论】:

          猜你喜欢
          • 2011-08-27
          • 2017-02-23
          • 2023-04-08
          • 1970-01-01
          • 2017-07-08
          • 2013-03-07
          • 2012-12-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多