簡體   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