C# 14 新增功能一览,你觉得实用吗?
前言
今天咱们一起来看看在 C# 14 中新增的几个功能特性,是否给我们日常编码带了来便利。
前提准备
要体验 C# 14 中的新增功能,你需要安装最新的 Visual Studio 2022 版本或下载 .NET 10 SDK。
- 下载 .NET 10 SDK:https://dotnet.microsoft.com/zh-cn/download/dotnet/10.0

扩展成员(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;
}
参考文章
- https://learn.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-14
- https://learn.microsoft.com/zh-cn/dotnet/csharp/programming-guide/classes-and-structs/extension-methods
C# 14 新增功能一览,你觉得实用吗?的更多相关文章
- Hanlp1.7版本的新增功能一览
Hanlp1.7版本在去年下半年的时候就随大快的DKH1.6版本同时发布了,截至目前1.7大版本也更新到了1.7.1了.本篇分别就1.7.0和1.7.1中新增的功能做一个简单的汇总介绍. HanLP ...
- .NET平台系列14 .NET5中的新增功能
系列目录 [已更新最新开发文章,点击查看详细] .NET5中不包含的内容 尽管 .NET5 框架中提供了一组重要 API,但它并不包括过去20年左右开发的所有 API,但是.NET Stand ...
- ES6,ES2105核心功能一览,js新特性详解
ES6,ES2105核心功能一览,js新特性详解 过去几年 JavaScript 发生了很大的变化.ES6(ECMAScript 6.ES2105)是 JavaScript 语言的新标准,2015 年 ...
- SQL Server 2016 Alwayson新增功能
标签:SQL SERVER/MSSQL SERVER/数据库/DBA/ 概述 SQLServer2016发布版本到现在已有一年多的时间了,目前最新的稳定版本是SP1版本.接下来就开看看2016在Alw ...
- Windows Server 2016-Hyper-V 2016新增功能
本文解释了Windows Server 2016和Microsoft Hyper-V Server 2016上Hyper-V的新增功能和变更功能. 与Connected Standby兼容(新) 在使 ...
- THML5新增功能
HTML5新增功能 1.语义化标记: 1)article:article标签装载显示一个独立的文章内容.例如一篇完整的论坛帖子,一则网站新闻,一篇博客文章等等,一个用户评论等等 artilce可以嵌套 ...
- ABP Framework V4.4 RC 新增功能介绍
目录 新增功能概述 启动模板删除 EntityFrameworkCore.DbMigrations 项目 CMS-Kit 动态菜单管理 Razor引擎对文本模板的支持 DbContext/Entiti ...
- iOS14新功能一览
这是转载的6月份的一篇文章,但是和今天发布的 ios14 正式版基本一致,可以大概参考一下. 23 号凌晨的 WWDC ,小狐也是恪尽职守啊!从开场到收尾,小狐一点也没落下,整场大会围绕着 Apple ...
- ABP Framework 5.3.0 版本新增功能和变更说明
ABP Framework 5.3.0 稳定版已在2022年6月14日正式发布. 以下是本版本的新增功能: "开始"页面提供创建单层项目选项 启动模板提供 PWA 支持 Volo. ...
- Java SE 14 新增特性
Java SE 14 新增特性 作者:Grey 原文地址:Java SE 14 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...
随机推荐
- 流程控制之do while循环
语法 do { //代码语句}while(布尔表达式): 与while的区别 while是先判断再执行,do while是先执行再判断 循环体至少会被执行一次 实例1: package com. ...
- 在windows主机本地快速部署使用deepseek-r1大模型
一台配备 Windows 操作系统.12GB 或以上显存的英伟达显卡.8GB 或以上内存,并能连接互联网的电脑可以继续阅读以下内容. 简介 Ollama(用于下载和启动大模型) Ollama 专注于本 ...
- extern和static
extern和static extern和static两者之间是有一种相克的关系:用了extern的不能用static,用了static的不能用extern, extern是声明让别的文件中能够使用, ...
- tomcat启动时启动窗口出现乱码的解决方案
工具/原料 一台安装了tomcat的电脑 方法/步骤 先来看看问题(图示),在tomcat的启动窗口打印的启动信息中包含了大量的中文乱码,虽然这些对tomcat本身的使用没有任何影响,但却 ...
- 数据挖掘 | 数据隐私(2) | 差分隐私 | 数据重构化攻击(Reconstruction Attacks)
L2-Reconstruction Attacks 本节课的目的在于正式地讨论隐私,但是我们不讨论算法本身有多隐私,取而代之去讨论一个算法隐私性有多么的不可靠.并且聚焦于 Dinur 与 Nissim ...
- go、thinkphp8、webman数据读取并发测试、性能测试
前期准备:本地搭建程序运行所需环境,分别编写go,thinkphp8和webman程序,确保程序运行正常,新建mysql的student表,模拟存储学生信息,共计3646条数据,分别使用go语言.th ...
- echarts柱形图给X轴坐标类目添加点击事件
在项目中遇到这么个需求要在柱形图上的x轴添加点击事件,当点击对应x轴文字的时候要弹出模态框展示子图表 根据echarts的Api给图表实例绑定点击事件 myChartInstance?.on('cli ...
- stat() "/root/xxx/index.html" failed (13: Permission denied)
前言 在 nginx 上部署静态网页报502,于是查看 nginx 错误日志 error_log /var/log/nginx/error.log;,却没有看到任何错误信息:访问 nginx活动日志 ...
- go time包:秒、毫秒、纳秒时间戳输出
时间戳 10 位数的是以 秒 为单位: 13 位数的是以 毫秒 为单位: 19 位数的是以 纳秒 为单位: golang 中可以这样写: package main import ( "fmt ...
- Centos下安装php mysql pdo以及gd扩展
pdo扩展安装: yum install php-pdo pdomysql扩展安装: yum install php-pdo_mysql gd库扩展安装: yum install php-gd 安装后 ...