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


当前回答

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

其他回答

何时使用哪个关键字?

一个简单的例子: 使用final:如果你不知道它在编译时的值是多少。例如,当您需要从API获取数据时,就会在运行代码时发生这种情况。

使用const:如果您确定在运行代码时不会更改某个值。例如,当你声明一个始终保持不变的句子。

https://itnext.io/difference-between-const-and-final-in-dart-78c129d0c573

简单的单词:

常量

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

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

最后

值必须在运行时已知。

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

final和const都防止变量被重新赋值(类似于Java中的final或JavaScript中的const)。

这种差异与内存的分配方式有关。在运行时为final变量分配内存,在编译时为const变量分配内存。最后一个修饰符应该是更常用的,因为许多程序变量不需要任何内存,因为程序逻辑不会调用它们进行初始化。对于一个const变量,你基本上是在告诉计算机,“嘿,我需要这个变量的内存,因为我知道我将会需要它。”

以这种方式思考它们可以更容易地理解它们在语法用法上的差异。主要是final变量可以是实例变量,而const必须是类上的静态变量。这是因为实例变量是在运行时创建的,而const变量(根据定义)不是。因此,类上的const变量必须是静态的,这意味着类上存在该变量的单个副本,而不管该类是否实例化。

这段视频相当简单地解释了这一点: https://www.youtube.com/watch?v=9ZZL3iyf4Vk

本文将更深入地讨论并解释两者之间非常重要的语义差异,即final修改变量而const修改值,这本质上归结为只能初始化编译时可派生的const值。

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

dart中的Final和const很容易混淆,以至于我们认为它们是相同的。

让我们来看看它们的区别:

附注:我包括图像而不是文本,因为我不能将信息制成表格 在Stackoverflow .md格式轻松。

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