C# 9.0 新特性預覽 - 類型推導的 new

来源:https://www.cnblogs.com/Rwing/archive/2020/05/06/csharp-9-0-preview-target-typed-new.html
-Advertisement-
Play Games

隨著 .NET 5 發佈日期的日益臨近,其對應的 C# 新版本已確定為 C# 9.0,其中新增加的特性(或語法糖)也已基本鎖定,本系列文章將向大家展示它們。 ...


C# 9.0 新特性預覽 - 類型推導的 new

前言

隨著 .NET 5 發佈日期的日益臨近,其對應的 C# 新版本已確定為 C# 9.0,其中新增加的特性(或語法糖)也已基本鎖定,本系列文章將向大家展示它們。

目錄

[C# 9.0 新特性預覽 - 類型推導的 new]
[C# 9.0 新特性預覽 - Lambda 中的棄元]
[C# 9.0 新特性預覽 - 更簡便的空參數檢查]
[C# 9.0 新特性預覽 - Record 類型]
[C# 9.0 新特性預覽 - 模式匹配的改善]
[C# 9.0 新特性預覽 - 其他小的變化]

具有類型推導的 new 表達式 (Target-typed new expressions)

這是一個本應隨著 C# 8.0 發佈的語言特性,但因種種原因在發佈 C# 8.0 的最後關頭,它被移出了最終的發佈版本,下麵我們來認識認識它。
大家都知道,C# 在3.0中新增 var 關鍵字來做隱式類型聲明,把繁重的聲明語法簡化了。

Dictionary<string, List<int>> field = new Dictionary<string, List<int>>()
// 可以簡化為
var field = new Dictionary<string, List<int>>()

var 關鍵字的基本原理不再覆述,簡單說就是編譯器可以根據等號後面的類型推導出 var 的類型,那麼是不是也可以反過來,我們先聲明類型,接下來的 new 關鍵字後面就不用寫類型了呢?於是本文介紹的特性來了:

Dictionary<string, List<int>> field = new Dictionary<string, List<int>>()
// C# 9.0 中可以寫成
Dictionary<string, List<int>> field = new()

從以上代碼可以看出語法很簡單,即省略了繁瑣的可以推導出的類型。
其語法 Spec 如下:

'new' '(' argument_list? ')' object_or_collection_initializer?

搭配初始化器,我們可以進一步簡化帶有初始值的初始化。

Dictionary<string, List<int>> field = new() {
    { "item1", new() { 1, 2, 3 } }
};

進一步展示該語法在各種情況下的使用

在所有可以推導出類型的上下文中,都可以使用,例如:

XmlReader.Create(reader, new() { IgnoreWhitespace = true });

帶有參數的構造方法:

class C {
    C(params int[] p) {}
}

C c = new(1, 2, 3);

調用方法時:

class A {}
static void M(A a) {};

M(a: new());

配合對象初始化器:

X x = new() { field = 42 };

泛型的類型推導,需要註意,要有一個顯示類型聲明才能正確推導:

void M<T>(T t1, T t2) {}

M(new X(), new());

類似的,數組的聲明

var arr = new[] {new X(), new()};

不適用此特性的場景

值類型的初始化,可以使用 default 替代

int x = new(); // ERROR
Struct y = new(); // ERROR

使用 as 操作時無法正確推導

Console.Write(new() as X); // ERROR

自然,使用 var 時也無法推導

var x = new(); // ERROR

有歧義的重載

void M(object a, X b) => Console.Write($"{a} {b}");
void M(X a, object b) => Console.Write($"{a} {b}");

M(new(), new()); // ERROR

需要註意的地方

這個新語法 new(),比較容易與匿名類型語法混淆 new{},它們兩個是完全不同的東西,需要註意一下。

參考

[Proposal: Target-typed new expressions]
[Unit test: TargetTypedNewTests.cs]


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 項目簡介 項目來源於: "https://github.com/wenlongup/LostAndFound" 因原github倉庫無資料庫文件,經過本人修改,現將該倉庫重新上傳至個人gitee倉庫。 "https://gitee.com/coderzcr/LostAndFound" 本系統基於 J ...
  • 前言 隨著互聯網時代的到來,人們更加傾向於互聯網購物。某寶又是電商行業的巨頭,在某寶平臺中有很多商家數據。 今天帶大家使用python+selenium工具獲取這些公開的 適合人群: Python零基礎、對爬蟲數據採集感興趣的同學! 環境介紹: python 3.6pycharmseleniumti ...
  • 之前在博客上分享過一篇文章,涉及到 Java 中的註釋,就信誓旦旦地寫了一句話:“註釋是不會被執行的!”結果,有小伙伴留言說,“老師,你確定嗎?” 我這個人一直有個優點,就是能聽得進去別人的聲音,管你是贊美的還是批評的,從來都是虛心接受。因為我相信,大多數小伙伴都是出於善的目的。 況且,我在技術上從 ...
  • phpstorm2020新版激活方法,怎麼獲取?網上找了好多,都過時了,不能用,最終找到一個好的方法,不斷一更新,歡迎收藏! phpstorm2020最新版激活方法 永久更新,每隔一段時間更新新版的激活碼,歡迎索取,只提供學習。索取方法,關註公眾號:雲碼素材,回覆phpstorm. ...
  • 不可變類的意思是創建該類的實例後,該實例的實例變數是不可改變的。Java提供的8個包裝類和String類都是不可變類。因此String和8個包裝類都具有不可變性。 就拿String類來說,通過閱讀String類的源碼我們可以發現其實整個String類是被final所修飾,而其用來存儲值的底層實際上是 ...
  • 作者:小書go https://blog.csdn.net/qzcsu/article/details/72861891 背景描述 我們知道網路層,可以實現兩個主機之間的通信。但是這並不具體,因為,真正進行通信的實體是在主機中的進程,是一個主機中的一個進程與另外一個主機中的一個進程在交換數據。IP協 ...
  • 概述 性能優化一向是後端服務優化的重點,但是線上性能故障問題不是經常出現,或者受限於業務產品,根本就沒辦法出現性能問題,包括筆者自己遇到的性能問題也不多,所以為了提前儲備知識,當出現問題的時候不會手忙腳亂,我們本篇文章來模擬下常見的幾個Java性能故障,來學習怎麼去分析和定位。 另外要註意:光理論是 ...
  • 1、數據結構的歷史背景及現狀,有沒有必要學習數據結構 在電腦發展的初期,人們使用電腦的目的主要是處理數值計算問題。當我們使用電腦來解決一個具體問題時,一般需要經過下列幾個步驟:首先要從該具體問題抽象出一個適當的數學模型,然後設計或選擇一個解此數學模型的演算法,最後編出程式進行調試、測試,直至得到 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...