探索 C# 14 新功能:实用特性为编程带来便利
笔记哥 /
05-06 /
41点赞 /
0评论 /
993阅读
## 前言
今天咱们一起来看看在 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 之前:
```csharp
namespace CustomExtensionMethods;public static class MyExtensions{ public static int WordCount(this string str) => str.Split([' ', '.', '?'], StringSplitOptions.RemoveEmptyEntries).Length;}
```
### C# 14 开始:
```csharp
namespace CustomExtensionMembers;public static class MyExtensions{ extension(string str) { public int WordCount() => str.Split([' ', '.', '?'], StringSplitOptions.RemoveEmptyEntries).Length; }}
```
## field 关键字
使用令牌 field 可以编写属性访问器体,而无需声明后备字段。令牌 field 将替换为编译器合成支持字段。
例如,C# 14 之前,如果要确保 string 属性无法设置为 null,则必须声明一个后备字段并实现这两个访问器:
```csharp
private string _msg;public string Message{ get => _msg; set => _msg = value ?? throw new ArgumentNullException(nameof(value));}
```
C# 14 开始,现在可以简化代码:
```csharp
public string Message{ get; set => field = value ?? throw new ArgumentNullException(nameof(value));}
```
可以为字段支持的属性的一个或两个访问器声明一个主体。
## 隐式跨度转换
C# 14 在语言中引入了对 `System.Span` 和 `System.ReadOnlySpan` 的一流支持。这种支持包括新的隐式转换,使得使用这些类型进行编程更加自然。
在 C# 和运行时中,`Span` 和 `ReadOnlySpan` 被用于多种关键方式。他们的引入可提高性能,而不会造成安全风险。C# 14 识别其相互关系,并支持在 `ReadOnlySpan`、`Span` 和 `T[]` 之间进行一些转换。跨度类型可以作为扩展方法的接收器、与其他转换组合,或者在泛型类型推理场景中提供帮助。
## 未绑定的泛型类型与nameof
从 C# 14 开始,nameof 的参数可以是未绑定的泛型类型。例如,`nameof(List<>)` 计算为 `List`。在早期版本的 C# 中,只能使用关闭的泛型类型(例如 `List`)返回 `List` 名称。
## 带修饰符的简单 lambda 参数
从 C# 14 开始,可以在不指定参数类型的情况下,向 `lambda` 表达式参数添加参数修饰符,例如:`scoped、ref、in、out或 ref readonly`。
## 支持更多部分成员(partial members)
从 C# 14 开始可以将`实例构造函数`和`事件`声明为`部分成员(partial members)`。
>
>
> 注意:部分构造函数和分部事件必须包含一个定义声明和一个实现声明。
>
## Null 条件赋值
Null 条件成员访问运算符`“?.”`和`“?[]”`现在可在赋值或复合赋值的左侧使用。
在 C# 14 之前,在分配给属性之前,需要对变量进行 null 检查:
```csharp
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。
>
```csharp
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
本文来自投稿,不代表本站立场,如若转载,请注明出处:http//www.knowhub.vip/share/2/3114
- 热门的技术博文分享
- 1 . ESP实现Web服务器
- 2 . 从零到一:打造高效的金仓社区 API 集成到 MCP 服务方案
- 3 . 使用C#构建一个同时问多个LLM并总结的小工具
- 4 . .NET 原生驾驭 AI 新基建实战系列Milvus ── 大规模 AI 应用的向量数据库首选
- 5 . 在Avalonia/C#中使用依赖注入过程记录
- 6 . [设计模式/Java] 设计模式之工厂方法模式
- 7 . 5. RabbitMQ 消息队列中 Exchanges(交换机) 的详细说明
- 8 . SQL 中的各种连接 JOIN 的区别总结!
- 9 . JavaScript 中防抖和节流的多种实现方式及应用场景
- 10 . SaltStack 远程命令执行中文乱码问题
- 11 . 推荐10个 DeepSeek 神级提示词,建议搜藏起来使用
- 12 . C#基础:枚举、数组、类型、函数等解析
- 13 . VMware平台的Ubuntu部署完全分布式Hadoop环境
- 14 . C# 多项目打包时如何将项目引用转为包依赖
- 15 . Chrome 135 版本开发者工具(DevTools)更新内容
- 16 . 从零创建npm依赖,只需执行一条命令
- 17 . 关于 Newtonsoft.Json 和 System.Text.Json 混用导致的的序列化不识别的问题
- 18 . 大模型微调实战之训练数据集准备的艺术与科学
- 19 . Windows快速安装MongoDB之Mongo实战
- 20 . 探索 C# 14 新功能:实用特性为编程带来便利
- 相关联分享