前言

今天咱们一起来看看在 C# 14 中新增的几个功能特性,是否给我们日常编码带了来便利。

前提准备

要体验 C# 14 中的新增功能,你需要安装最新的 Visual Studio 2022 版本或下载 .NET 10 SDK。

扩展成员(Extension Members)

从 C# 14 开始,可以使用两种语法来定义扩展方法。C# 14 添加了 extension 容器,可以声明扩展块,扩展块是包含类型或该类型的实例的扩展成员的非嵌套、非泛型静态类中的块。在 C# 14 之前,将修饰符添加到 this 静态方法的第一个参数,以指示该方法显示为参数类型的实例的成员。

下面的代码示例定义了 string 类型的扩展块。扩展块包含一个成员:计算字符串中单词的方法:

C# 14 之前:

namespace CustomExtensionMethods;

public static class MyExtensions
{
    public static int WordCount(this string str) =>
        str.Split([' ', '.', '?'], StringSplitOptions.RemoveEmptyEntries).Length;
}

C# 14 开始:

namespace CustomExtensionMembers;

public static class MyExtensions
{
    extension(string str)
    {
        public int WordCount() =>
            str.Split([' ', '.', '?'], StringSplitOptions.RemoveEmptyEntries).Length;
    }
}

field 关键字

使用令牌 field 可以编写属性访问器体,而无需声明后备字段。令牌 field 将替换为编译器合成支持字段。

例如,C# 14 之前,如果要确保 string 属性无法设置为 null,则必须声明一个后备字段并实现这两个访问器:

private string _msg;
public string Message
{
    get => _msg;
    set => _msg = value ?? throw new ArgumentNullException(nameof(value));
}

C# 14 开始,现在可以简化代码:

public string Message
{
    get;
    set => field = value ?? throw new ArgumentNullException(nameof(value));
}

可以为字段支持的属性的一个或两个访问器声明一个主体。

隐式跨度转换

C# 14 在语言中引入了对 System.Span<T> 和 System.ReadOnlySpan<T> 的一流支持。这种支持包括新的隐式转换,使得使用这些类型进行编程更加自然。

在 C# 和运行时中,Span<T> 和 ReadOnlySpan<T> 被用于多种关键方式。他们的引入可提高性能,而不会造成安全风险。C# 14 识别其相互关系,并支持在 ReadOnlySpan<T>Span<T> 和 T[] 之间进行一些转换。跨度类型可以作为扩展方法的接收器、与其他转换组合,或者在泛型类型推理场景中提供帮助。

未绑定的泛型类型与nameof

从 C# 14 开始,nameof 的参数可以是未绑定的泛型类型。例如,nameof(List<>) 计算为 List。在早期版本的 C# 中,只能使用关闭的泛型类型(例如 List<int>)返回 List 名称。

带修饰符的简单 lambda 参数

从 C# 14 开始,可以在不指定参数类型的情况下,向 lambda 表达式参数添加参数修饰符,例如:scoped、ref、in、out或 ref readonly

支持更多部分成员(partial members)

从 C# 14 开始可以将实例构造函数事件声明为部分成员(partial members)

注意:部分构造函数和分部事件必须包含一个定义声明和一个实现声明。

Null 条件赋值

Null 条件成员访问运算符“?.”“?[]”现在可在赋值或复合赋值的左侧使用。

在 C# 14 之前,在分配给属性之前,需要对变量进行 null 检查:

        public static void GetUserInfo()
        {
            UserInfo userInfo = null;

            if (userInfo is not null)
            {
                userInfo.Age = CalculateAge(userInfo);
            }
        }

        private static int CalculateAge(UserInfo userInfo)
        {
            return DateTime.Now.Year - userInfo.Birthday.Year;
        }

在 C# 14 中可以使用运算符简化上述代码 ?. :

注意:运算符 = 的右侧仅在左侧不为 null 时才会被计算。如果 userInfo 为 null,则代码不调用 CalculateAge。

        public static void GetUserInfo()
        {
            UserInfo userInfo = null;
            userInfo?.Name = CalculateAge(userInfo);
        }

        private static int CalculateAge(UserInfo userInfo)
        {
            return DateTime.Now.Year - userInfo.Birthday.Year;
        }

参考文章

C# 14 新增功能一览,你觉得实用吗?的更多相关文章

  1. Hanlp1.7版本的新增功能一览

    Hanlp1.7版本在去年下半年的时候就随大快的DKH1.6版本同时发布了,截至目前1.7大版本也更新到了1.7.1了.本篇分别就1.7.0和1.7.1中新增的功能做一个简单的汇总介绍. HanLP ...

  2. .NET平台系列14 .NET5中的新增功能

    系列目录     [已更新最新开发文章,点击查看详细] .NET5中不包含的内容 尽管 .NET5 框架中提供了一组重要 API,但它并不包括过去20年左右开发的所有 API,但是.NET Stand ...

  3. ES6,ES2105核心功能一览,js新特性详解

    ES6,ES2105核心功能一览,js新特性详解 过去几年 JavaScript 发生了很大的变化.ES6(ECMAScript 6.ES2105)是 JavaScript 语言的新标准,2015 年 ...

  4. SQL Server 2016 Alwayson新增功能

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/ 概述 SQLServer2016发布版本到现在已有一年多的时间了,目前最新的稳定版本是SP1版本.接下来就开看看2016在Alw ...

  5. Windows Server 2016-Hyper-V 2016新增功能

    本文解释了Windows Server 2016和Microsoft Hyper-V Server 2016上Hyper-V的新增功能和变更功能. 与Connected Standby兼容(新) 在使 ...

  6. THML5新增功能

    HTML5新增功能 1.语义化标记: 1)article:article标签装载显示一个独立的文章内容.例如一篇完整的论坛帖子,一则网站新闻,一篇博客文章等等,一个用户评论等等 artilce可以嵌套 ...

  7. ABP Framework V4.4 RC 新增功能介绍

    目录 新增功能概述 启动模板删除 EntityFrameworkCore.DbMigrations 项目 CMS-Kit 动态菜单管理 Razor引擎对文本模板的支持 DbContext/Entiti ...

  8. iOS14新功能一览

    这是转载的6月份的一篇文章,但是和今天发布的 ios14 正式版基本一致,可以大概参考一下. 23 号凌晨的 WWDC ,小狐也是恪尽职守啊!从开场到收尾,小狐一点也没落下,整场大会围绕着 Apple ...

  9. ABP Framework 5.3.0 版本新增功能和变更说明

    ABP Framework 5.3.0 稳定版已在2022年6月14日正式发布. 以下是本版本的新增功能: "开始"页面提供创建单层项目选项 启动模板提供 PWA 支持 Volo. ...

  10. Java SE 14 新增特性

    Java SE 14 新增特性 作者:Grey 原文地址:Java SE 14 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

随机推荐

  1. RFID基础——高频RFID协议、读写模块和标签

    RFID技术中的低频.高频.超高频有各自的优点和应用场景.其中,与我们个人生活息息相关的门禁卡.公交卡.身份证.图书标签主要用到的是高频RFID.这些应用也对应着高频RFID中不同的协议. 高频RFI ...

  2. WPF 调试工具使用

    参考链接: https://supportcenter.devexpress.com/ticket/details/t720001/how-to-use-the-snoop-utility-to-in ...

  3. [TJOI2015] 弦论 题解

    所有子串,一眼 \(\text{SAM}\). 从根开始一直往下走,走到任何一个点都代表一个子串.维护 \(sm\) 表示每个子串有几个(\(t=0\) 就当一个),可以用树形 \(dp\) 跳后缀链 ...

  4. FANUC发那科机器人主板维修,故障问题检测

    电容损坏引发的故障在电子设备中是特别高的,其中尤其以电解电容的损坏为常见 电容损坏表现为:1.容量变小:2.完全失去容量:3.漏电:4.短路. 电容在电路中所起的作用不同,引起的故障也各有特点.在发那 ...

  5. IIS反向代理和URL重写——实现https重定向,文件类型隐藏访问重写,nodejs等服务重写等等

    一.Why? 1.先来讲一讲为什么我们要使用url重写这个东西 2.因为我学习的后端是nodejs,然后我发现nodejs一个非常让人难受的事,就是它监听端口不是80和443时,你访问网页需要输入端口 ...

  6. Windows 提权-RunAs

    本文通过 Google 翻译 RunAs – Windows Privilege Escalation 这篇文章所产生,本人仅是对机器翻译中部分表达别扭的字词进行了校正及个别注释补充. 导航 0 前言 ...

  7. rust学习笔记(5)

    函数 定义为 fn is_divisible_by(lhs: u32, rhs: u32) -> bool { 使用 -> 指向返回的类型 函数定义的位置没有限制 method 针对结构体 ...

  8. Git 命令使用体验的神器 -- tig

    tig, 就是把 Git 这个单词倒过来念, 它是一个命令行工具, 日常使用中我用它来取代 Git 最高频的几个操作, 如 git log, git diff 以及 git blame等, 使用常见安 ...

  9. 云服务器下如何部署Flask项目详细操作步骤

    参考网上各种方案,再结合之前学过的Django部署方案,最后确定Flask总体部署是基于:centos7+nginx+uwsgi+python3+Flask之上做的. 本地windows开发测试好了我 ...

  10. PIL或Pillow学习2

    接着学习下Pillow常用方法: PIL_test1.py : ''' 9, Pillow图像降噪处理 由于成像设备.传输媒介等因素的影响,图像总会或多或少的存在一些不必要的干扰信息,我们将这些干扰信 ...