如何在 Dart 中声明集合?

How to declare collections in Dart?

由于 dart 2.12 集合构造函数已弃用(例如:List<Foo>())。鉴于此,我知道有两种实例化集合的方法如下:

设置示例:

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>{};

lint 参考:https://dart-lang.github.io/linter/lints/prefer_collection_literals.html

As dart 2.12 collections constructors are deprecated (Ex: List<Foo>()).

AFAIK, List<Foo>() 已弃用。这被弃用了,因为它采用了一个指定初始大小的可选参数,这对于 null-safety 是有问题的(不再可能用 null 元素填充不可为 null 的类型的 List )。 SetMap.

的零参数构造函数不存在该问题

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

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

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


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