首页 文章

Dart中''const' ' and ' 'final''关键字有什么区别?

提问于
浏览
18

Dart语言中 constfinal 关键字有什么区别?

这让我很困惑 .

3 回答

  • 0

    我在dart的网站上发现了这篇文章,它解释得非常好 .

    https://news.dartlang.org/2012/06/const-static-final-oh-my.html

    最后:

    “final”表示单一赋值:最终变量或字段必须具有初始值 . 一旦赋值,就不能改变最终变量的值 . final修改变量 .

    常数:

    “const”的含义在Dart中有点复杂和微妙 . const修改值 . 您可以在创建集合时使用它,例如const [1,2,3],以及构造对象(而不是new)时的const Point(2,3) . 这里,const意味着对象的整个深度状态可以在编译时完全确定,并且对象将被冻结并完全不可变 . Const对象有一些有趣的属性和限制:它们必须从可以在编译时计算的数据创建 . const对象无法访问运行时需要计算的任何内容 . 1 2是一个有效的const表达式,但新的DateTime.now()不是 . 它们是深刻的,过渡性的一成不变的 . 如果您有包含集合的final字段,则该集合仍然可以变为可变 . 如果你有一个const集合,那么它中的所有东西也必须是递归的const . 它们是规范化的 . 这有点像字符串实习:对于任何给定的const值,无论const表达式被计算多少次,都将创建并重用单个const对象 .

  • 7

    通过@Meyi扩展答案

    • 最终变量只能设置一次并在访问时初始化 . (例如,如果使用 biggestNumberOndice 的值,则从下面的代码部分开始,然后将初始化该值并分配内存) .

    • const本质上是内部最终的,但主要区别在于它的编译时间常量在编译期间初始化,即使你不使用它的值它也会被初始化并占用内存空间 .

    • 类中的变量可以是final但不是常量,如果你想在类级别使用常量,则使其成为静态const .

    Code:

    void main() {
    
        // final demonstration
        final biggestNumberOndice = '6';
        //  biggestNumberOndice = '8';     // Throws an error for reinitialization
    
        // const
        const smallestNumberOnDice = 1;
    
    }
    
    class TestClass {
    
        final biggestNumberOndice = '6';
    
        //const smallestNumberOnDice = 1;  //Throws an error
        //Error .  only static fields can be declared as constants.
    
        static const smallestNumberOnDice = 1;
    }
    
  • 19

    如果你来自 C++ ,那么 Dart 中的 constC++ 中是 constexprDart 中的 finalC++ 中是 const .

    以上仅适用于原始类型 . 但是在 Dart 中,标记为 final 的对象在其成员方面是可变的 .

相关问题