在Dart中,const和final关键字之间有什么区别?


当前回答

简单的单词:

常量

值必须在编译时已知,即来自内部文件的值。

示例:API键,应用程序支持的语言或helper文件中的任何变量,基本上是应用程序附带的任何东西。

最后

值必须在运行时已知。

它可以是上面的数据,也可以是设备信息,当应用程序启动时将被检查,或者当应用程序启动时从API或服务器加载的数据,但在应用程序准备使用之前,即你需要检查用户是否登录,你的应用程序将从服务器加载或检查会话令牌。

其他回答

Const表示它的初始值必须是固定的,不能是动态值;

Final意味着它的初始值必须是固定的,但可以是一个动态值,等于具有固定值的var。

代码演示

常量

void main() {
  const sum = 1 + 2;
  // ✅ const can not change its value
  print("sum = ${sum}");
  // ⚠️ Const variables must be initialized with a constant value.
  const time = new DateTime.now();
  // ❌ Error: New expression is not a constant expression.
  print("time = ${time}");
}

最后

// new DateTime.now();
// dynamic timestamp

void main() {
  final sum = 1 + 2;
  // ✅ final can not change its value
  print("sum = ${sum}");
  final time = new DateTime.now();
  // ✅ final === var with fixed value
  print("time = ${time}");
}

截图

refs

https://dart.dev/guides/language/language-tour#final-and-const

简单的单词:

常量

值必须在编译时已知,即来自内部文件的值。

示例:API键,应用程序支持的语言或helper文件中的任何变量,基本上是应用程序附带的任何东西。

最后

值必须在运行时已知。

它可以是上面的数据,也可以是设备信息,当应用程序启动时将被检查,或者当应用程序启动时从API或服务器加载的数据,但在应用程序准备使用之前,即你需要检查用户是否登录,你的应用程序将从服务器加载或检查会话令牌。

如果你来自c++,那么Dart中的const在c++中是constexpr,而Dart中的final在c++中是const。

以上内容仅适用于基本类型。 然而在Dart中,标记为final的对象在其成员方面是可变的。

const是一个编译时常量。

final是一个运行时常数。

通过@Meyi扩展答案

final variable can only be set once and it is initialized when accessed.(for example from code section below if you use the value of biggestNumberOndice only then the value will be initialized and memory will be assigned). const is internally final in nature but the main difference is that its compile time constant which is initialized during compilation even if you don't use its value it will get initialized and will take space in memory. Variable from classes can be final but not constant and if you want a constant at class level make it static const.

代码:

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;
}