[英]How to declare collections in Dart?
由于 dart 2.12 collections 构造函数已被弃用(例如: List<Foo>()
)。 鉴于此,我知道实例化 collections 的两种方法如下:
设置示例:
final Set<String> fooSet = {};
final barSet = <String>{};
列表示例:
final List<String> fooList = [];
final barList = <String>[];
我想问一下您使用哪种方法以及为什么(优点和缺点),因为我的团队倾向于同时使用这两种方法。 我们想达成协议并选择一个以保持一致性。
编辑:
我知道这两种方法在语义上有些不同(但几乎可以肯定它会生成相同的操作码),因为在第一个示例中,编译器在给定变量类型的情况下识别实例化类型,而在第二个示例中,给定实例化自动分配变量类型类型。
final List<String> fooList = <String>[];
将是两者的显式声明,但编写起来可能有些麻烦。
根据 lint,最好的方法是:
var points = [];
var addresses = <String,String>{};
var uniqueNames = <String>{};
var ids = <int>{};
var coordinates = <int,int>{};
棉绒参考: https://dart-lang.github.io/linter/lints/prefer_collection_literals.html
由于 dart 2.12 collections 构造函数已被弃用(例如:
List<Foo>()
)。
AFAIK,仅List<Foo>()
已弃用。 这已被专门弃用,因为它采用了一个指定初始大小的可选参数,这对于 null 安全性是有问题的(不再可能使用 null 元素填充不可为 null 类型的List
)。 Set
和Map
的零参数构造函数不存在该问题。
关于final List<String> fooList = [];
vs final barList = <String>[];
,这有点见仁见智,但我更喜欢后者,因为我认为它不太容易出错。 例如,假设有人忘记显式指定元素类型:
final List list = ['foo', 'bar', 'baz'];
很多人错误地认为list
将被推断为List<String>
类型。 实际上,它将是List<dynamic>
类型,因为没有类型参数的List
是List<dynamic>
1的简写,然后将从左侧推断右侧。 (启用strict-raw-types
分析选项可以帮助捕获此类情况,但我宁愿避免一开始就编写它们。)
1这适用于所有泛型类,而不仅仅是List
。 在一般情况下,给定class Generic<T extends B> {}
,没有类型参数的Generic
是Generic<B>
的简写。 如果T
不受约束,则B
是dynamic
的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.