gpt4 book ai didi

variables - 在 Dart 中修改类中的最终字段

转载 作者:行者123 更新时间:2023-12-04 11:23:47 24 4
gpt4 key购买 nike

Dart 文档阅读:

If you never intend to change a variable, use final or const, either instead of var or in addition to a type. A final variable can be set only once;



好的,这意味着第二次分配最终变量将不起作用, 但是 没有
说的是修改,即

void main() {
final List<int> list = [1,2,3];

list = [10, 9, 8]; //error!

list
..clear()
..addAll([10, 9, 8]); //works!
}

可以看出,本质上,我重新分配了最终变量 list .这不是与最终变量的整个想法相矛盾吗?

最佳答案

final并不意味着 final .list即使您修改列表内容,变量引用仍然是相同的列表实例。即使将任何可变实例分配给最终变量,也可以修改它。
想象

void main() {
var l = [1,2,3];
final List<int> list = l;
}
现在您将无法修改 l 引用的列表中的项目。因为列表也分配给了最后一个字段 list ( listl 引用同一个列表)。那没有意义。
您可以做的是使列表不可变
final List<int> list = const[1,2,3];  
现在您不能将另一个列表分配给 list并且您不能修改 list 引用的列表的内容.
另一种方式
  import 'dart:collection'
...
var l = [1,2,3];
final List<int> list = UnmodifiablyListView(l);
现在不能修改 listlist 引用的列表内容但是可以修改 l引用的内容( list 将反射(reflect)对 l 所做的更改)。
如果您丢失了对 l 的引用您无法修改内容。
  var l = [1,2,3];
final List<int> list = UnmodifiablyListView(l);
l = null;
final例如,当您想要确保 list 时很好字段从不设置为 null .
class MyModel {
final list = [];
}
list字段是公开的,但没有人可以设置 list例如 null .
var model = new MyModel();
...
model.list.forEach(print);
永远不会失败,像 null doesn't have a method 'forEach' 这样的异常.
这是相似的,但比
class MyModel {
var _list = [];
List get list => _list;
}

关于variables - 在 Dart 中修改类中的最终字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26235849/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com