C# 8:new關鍵字將能夠推斷類型


在許多情況下,在給定的位置只能是確定的類型。但是C#卻要求顯示的列出類型名稱。如果Target-typed new表達式的建議被采納,像這樣的模板代碼將不再需要。

表面上看,這個特征跟var關鍵字相反。但是它不是從表達式中推斷變量類型,而是從變量中推斷表達式的類型。下面分別是使用當前語法及建議語法的例子。

//當前語法
Dictionary<string, List<int>> field = new Dictionary<string, List<int>>();
//建議語法
Dictionary<string, List<int>> field = new();

像你看到的一樣,當C#能夠根據上下文推斷出類型時,就不需要再詳細制定類型了。對於局部變量,它並不是很有趣。它更能在臨時參數的場景下發揮作用。

//當前寫法
XmlReader.Create(reader, new XmlReaderSettings() { IgnoreWhitespace = true });
//建議寫法
XmlReader.Create(reader, new() { IgnoreWhitespace = true });

再上面的代碼中,類XmlReaderSettings並不是很有趣。它只不過是為了將選項值賦值給XmlReader。甚至有人認為XmlReaderSettings的出現能讓我們忽視真正重要的信息。

在var關鍵字並不適用的場景下,比如字段和屬性,這個特征比較有用。

private readonly static object s_syncObj = new();

根據這項建議,如下四種場景不適合使用。

  • 枚舉: 並不是所有的枚舉類型都包含0,因此應該明確列出每一個枚舉成員。
  • 接口:這是一個小眾的特征,最好明確的提出類型。
  • 數組: 數組的語法要求提供數組長度。
  • 結構體的默認構造函數: 這排除了所有基本類型和大多數值類型。如果您想使用此類類型的默認值,那么可以編寫default。

目前,調用者表達式屬性在c# 8路線圖中以狀態“Prototype”列出。特性測試計划在GitHub上可用。

本文翻譯自:C# 8: Type Inference for the new Keyword

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM