美文网首页Flutter
1. final 和 const(转)

1. final 和 const(转)

作者: JohnSnow_b20c | 来源:发表于2020-07-18 17:36 被阅读0次

    转自Konie Shadow

    如果你从不打算改变一个变量,请使用 finalconst,而不是 var 或者一个类型名。Final 变量只可以被设置一次;而 const 变量是编译期常量。(Const 变量是隐式 final 的。)一个 final 的顶级变量或者类变量在首次被使用时初始化。

    说明:实例变量只可以是 final 的,不可以是 const 的。Final 实例变量必须在构造函数体开始前被初始化——在变量声明时、通过构造函数参数或者在构造函数的 初始化列表 中。

    这里是创建并设置一个 final 变量的例子:

    final name = 'Bob'; // 没有类型声明
    final String nickname = 'Boddy';
    

    你不可以改变一个 final 变量的值:

    name = 'Alice'; // 错误:一个 final 变量只可以被设置一次
    

    对那些你想要作为编译期常量的变量使用 const。如果这个 const 变量是类级别的,使用 static const 标识它。在你声明的时候,设置变量的值为编译期常量比如数字、字符串字面量、另一个常量或者常量数值的算术运算结果。

    const bar = 1000000; // 压力单位(达因/cm2)
    const double atm = 1.01325 * bar; // 标准大气压
    

    Const 关键词不仅可以声明常量。你还可以使用它创建常量值,也可以声明创建常量值的构造函数。任何变量都可以拥有一个常量值。

    var foo = const [];
    final bar = const [];
    const baz = []; // 等同于 `const []`
    

    你可以忽略常量声明中初始化表达式中的 const,像上面的 baz 一样。详情请参阅 不要重复使用 const

    你可以改变一个非 final 且非 const 变量的值,即使它有一个常量值。

    foo = [1, 2, 3]; // 之前是 const []
    

    你不可以改变一个常量的值:

    baz = [42]; // 错误:常量不可以被赋值
    

    编译时常量 && 运行时常量

    编译时常量,就是它的值在编译时就能确定的常量,不是等到运行时才确定。
    运行时常量,就是在它的值在程序运行时才能确定。
    const是编译时常量,final就是运行时常量。
    const修饰的常量必须在声明时初始化,并且是可以确定的值,不是需要经过计算的值。
    final修饰的常量必须在声明进初始化或者在构造函数中初始化,它的值可以动态计算。
    共同点是两者赋值后就不能再修改(不能重新赋值,对于引用类型可以修改属性)。

    看一个Dart的常量实例:

    main() {
      const test1="hello";//正确,编译期常量
      final test2="hello";//正确,运行时常量
    
      const test3=DateTime.now();//编译报错,值不是编译期常量
      final test4=DateTime.now();//正确,运行时常量
    
      const test5=new List();//编译报错,值不是编译期常量
      final test6=new List();//正确,运行时常量
    }
    

    相关文章

      网友评论

        本文标题:1. final 和 const(转)

        本文链接:https://www.haomeiwen.com/subject/syjfkktx.html