如何在 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
)。 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 是 shorthand,而右-hand-side 然后将从左边推断出来。 (启用 strict-raw-types
分析选项可以帮助捕获此类情况,但我宁愿一开始就避免编写它们。)
1 这适用于所有通用 类,而不仅仅是 List
。在一般情况下,给定 class Generic<T extends B> {}
,没有类型参数的 Generic
对于 Generic<B>
是 shorthand。如果 T
不受约束,则 B
为 dynamic
。
由于 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
)。 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 是 shorthand,而右-hand-side 然后将从左边推断出来。 (启用 strict-raw-types
分析选项可以帮助捕获此类情况,但我宁愿一开始就避免编写它们。)
1 这适用于所有通用 类,而不仅仅是 List
。在一般情况下,给定 class Generic<T extends B> {}
,没有类型参数的 Generic
对于 Generic<B>
是 shorthand。如果 T
不受约束,则 B
为 dynamic
。