首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C# 14 新增功能实操!

C# 14 新增功能实操!

作者头像
郑子铭
发布2025-09-02 17:40:50
发布2025-09-02 17:40:50
12800
代码可运行
举报
运行总次数:0
代码可运行

前言

今天咱们一起来看看在 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 之前:

代码语言:javascript
代码运行次数:0
运行
复制
namespace CustomExtensionMethods;

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

C# 14 开始:

代码语言:javascript
代码运行次数:0
运行
复制
namespace CustomExtensionMembers;

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

field 关键字

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

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

代码语言:javascript
代码运行次数:0
运行
复制
private string _msg;
public string Message
{
    get => _msg;
    set => _msg = value ?? throw new ArgumentNullException(nameof(value));
}

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

代码语言:javascript
代码运行次数:0
运行
复制
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 检查:

代码语言:javascript
代码运行次数:0
运行
复制
        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。

代码语言:javascript
代码运行次数:0
运行
复制
        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
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-08-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 前提准备
  • 扩展成员(Extension Members)
    • C# 14 之前:
    • C# 14 开始:
  • field 关键字
  • 隐式跨度转换
  • 未绑定的泛型类型与nameof
  • 带修饰符的简单 lambda 参数
  • 支持更多部分成员(partial members)
  • Null 条件赋值
  • 参考文章
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档