Dart语言中Final与Const关键字的比较

发表时间: 2021-12-18 17:31


Dart语言中的不可变变量。意味着无法在应用程序整个生命周期内,更改存储在变量中的数据。但是为什么Dark要使用不可变变量呢?

想象一下,您正在为您的学校开发考试门户网站。您的任务是构建一个屏幕科学计算器。计算器中数学中最常用的符号是 π (Pi),它等于 3.1415,这是个真理,所以,我们要确保没有人可以改变存储在变量中的PI值,正是出于这个原因,Dart使用了不可变变量的概念。在Dart中,它使用'final'和'const'两个关分键字来执行。那么,它们的区别是什么呢?

例子一:


上图中,final 和 const定义的两个变量都是不可变的,即以后不能重新分配内容,但是,它们之间存在一些细微的差异。

首先,final变量可以在声明后初始化,而const变量则必须在声明时就要初始化。

例子二:


如果执行上述代码,最后一行PI=3.14;将返回错误,因为PI是const不可变变量,必须要在声明时就要写入内容。

例三:



final在初始化时赋值,变量将具有赋值的数据类型。但如果不在初始化时赋值,那么变量的数据类型就是动态的。所以上例中,variable1变量的类型是String类型,而variable2是dynamic类型。

同时,从内存分配上看,final变量仅在程序运行时才被分配内存,而Const变量在编译时也会被分配内存。这意味着,无论咱们在Dark代码中声明了多少个final变量,只有在程序运行调用时才会被分配内存。而const变量即使从未调用过,也会消耗内存。

再次,从类的角度看,一个类的实例变量可以是final,但不能是Const。为什么呢?

看例四:


在 DummyClass类中,定义const变量的age调用时将显示出错:"只有静态字段可以声明为const。"这个问题好解决,在const关键字之前添加一个静态字段即可。如例五:


综上,现在让咱们做一个小测试。看看下例的代码,想想哪一行会报错?

例六:


其实,上述代码都不会报错!为什么呢,这不是不可变的变量吗?是的,final和const都是不可变变量关键字,但可以通过列表去改变它们。咱们不能将新的列表分配给不可变类型,但咱们可以更新列表中的内容!!!有趣吧? 再看下例。

例七:


上面代码执行会报错,报错的是Const变量,而Final变量则顺利运行。这又是为什么?因为:咱们不能为程序运行时调用的const变量赋值!

Final和Const就是今天的Dart和Flutter学习的内容,如果您感兴趣,或者能对您有所启发,别忘了帮忙点赞支持。