在許多情況下,在給定的位置只能是確定的類型。但是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