微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Dart 中的“const”和“final”关键字有什么区别?

如何解决Dart 中的“const”和“final”关键字有什么区别?

dart 的网站上有一个帖子,它解释得很好。

“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;) 是已知的,那么您应该使用constoverfinalconst和之间还有另外两个较大的区别final。首先,如果您正在使用const,则必须将其声明为static const而不仅仅是const. 其次,如果你有一个const集合,那么里面的所有东西都在const. 如果你有一个final集合,那么里面的所有东西 final是.

final如果你不知道编译时的值,应该使用const它,它将在运行时计算/抓取。如果您想要一个无法更改的 HTTP 响应,如果您想从数据库获取某些内容,或者如果您想从本地文件中读取,请使用final. 在编译时不知道的任何事情都应该final结束const


综上所述,两者constfinal都不能重新分配,但是final对象中的字段,只要它们不是constfinal它们本身,都可以重新分配(与 不同const)。

解决方法

constDart 中的和final关键字有什么区别?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。