如何解决Dart 中的“const”和“final”关键字有什么区别?
“final” 表示单一赋值:final 变量或字段 必须 有一个初始化器。一旦分配了一个值,最终变量的值就不能更改。final 修改 变量 。
“const”在 Dart 中具有更复杂和微妙的含义。const 修改 值 。您可以在创建集合时使用它,例如 const [1, 2, 3],以及在构造对象(而不是 new)时,例如 const Point(2, 3)。在这里,const 意味着对象的整个深度状态可以完全在编译时确定,并且对象将被冻结并且完全不可变。
const 对象有几个有趣的属性和限制:
它们必须由可在编译时计算的数据创建。const 对象无权访问您在运行时需要计算的任何内容。1 + 2 是有效的 const 表达式,但 new DateTime.Now() 不是。
它们是深刻的、传递性的不可变的。如果您有一个包含集合的最终字段,则该集合仍然可以是可变的。如果您有一个 const 集合,则其中的所有内容也必须是 const 递归的。
它们是 规范化 的。这有点像字符串实习:对于任何给定的 const 值,无论对 const 表达式求值多少次,都将创建并重复使用单个 const 对象。
那么这是什么意思?
如果您拥有的值是在运行时计算的(new DateTime.Now()
例如),则 使用 const。但是,如果该值在编译时 ( const
a = 1;
) 是已知的,那么您应该使用const
overfinal
。const
和之间还有另外两个较大的区别final
。首先,如果您正在使用const
,则必须将其声明为static
const
而不仅仅是const
. 其次,如果你有一个const
集合,那么里面的所有东西都在const
.
如果你有一个final
集合,那么里面的所有东西 final
是.
final
如果你不知道编译时的值,应该使用const
它,它将在运行时计算/抓取。如果您想要一个无法更改的 HTTP
响应,如果您想从数据库中获取某些内容,或者如果您想从本地文件中读取,请使用final
. 在编译时不知道的任何事情都应该final
结束const
。
综上所述,两者const
和final
都不能重新分配,但是final
对象中的字段,只要它们不是const
或final
它们本身,都可以重新分配(与
不同const
)。
解决方法
const
Dart 中的和final
关键字有什么区别?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。