繁体   English   中英

如何在 Dart 中声明 collections?

[英]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 )。 SetMap的零参数构造函数不存在该问题。

关于final List<String> fooList = []; vs final barList = <String>[]; ,这有点见仁见智,但我更喜欢后者,因为我认为它不太容易出错。 例如,假设有人忘记显式指定元素类型:

final List list = ['foo', 'bar', 'baz'];

很多人错误地认为list将被推断为List<String>类型。 实际上,它将是List<dynamic>类型,因为没有类型参数的ListList<dynamic> 1的简写,然后将从左侧推断右侧。 (启用strict-raw-types分析选项可以帮助捕获此类情况,但我宁愿避免一开始就编写它们。)


1这适用于所有泛型类,而不仅仅是List 在一般情况下,给定class Generic<T extends B> {} ,没有类型参数的GenericGeneric<B>的简写。 如果T不受约束,则Bdynamic的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM