c#13新特性

C# 13 即 .NET 9 按照计划会在2024年11月发布,目前一些新特性已经定型,让我们来预览一个比较大型比较重要的新特性。

正文

扩展类型 Extension types

在5月份的微软 Build 大会中的 What's new in C# 13 会议上,两位大佬花了很长的篇幅来演示这个特性。

这个特性一直是大家很关心的,在 github 的 issue 上讨论的也是如火如荼,当然微软也隔了好多年。

首先,让我们来回顾一下 C# 中的扩展方法

复制代码
using System;

var zhangsan = new Person();
Console.WriteLine(zhangsan.GetAge());

public class Person
{
    public string Name { get; set; } 
    public DateTime Birthday { get; set; }
}

public static class PersonExtension
{
    public static int GetAge(this Person person) => DateTime.Now.Year - person.Birthday.Year;
}

以上代码演示了一个扩展方法声明方式及使用方法。

我们在不侵入 Person 类的基础上为 Person 类扩展了一个 GetAge() 的方法,虽然已经可以很方便的扩展出一些方法来,但是问题也是显而易见的,例如必须声明在静态类中、语法看起来很怪异、只能扩展方法而不能扩展属性等等。

于是,在即将到来的 C# 13 中,我们可以这样

复制代码
var zhangsan = new Person();
Console.WriteLine(zhangsan.GetAge());

public implicit extension PersonExtension for Person
{
    public int GetAge() => DateTime.Now.Year - this.Birthday.Year;
}

怎么样,语义是不是清晰了很多?

进一步的,年龄应该是一个属性而不应该是一个方法

复制代码
var zhangsan = new Person();
Console.WriteLine(zhangsan.Age);

public implicit extension PersonExtension for Person
{
    public int Age => DateTime.Now.Year - this.Birthday.Year;
}

困扰多年的如何扩展属性的问题终于得到了解决。

implicit extension / explicit extension

在上一个例子,不知道大家有没有注意到关键字是 implicit extension,那么很显然,会有一个对应的 explicit extension,下面让我们来看看花活

复制代码
var zhangsan = new Person();
if(zhangsan.IsStudent)
{
    Student zhangsanAsStudent = zhangsan;
    Console.WriteLine(zhangsanAsStudent.Grade);
}

public implicit extension PersonExtension for Person
{
    public int Age => DateTime.Now.Year - this.Birthday.Year;
    public bool IsStudent => this.Age < 18;
}

public explicit extension Student for Person
{
    public string Grade => "五年级";
}

可以看到,这里有一个显示扩展,显式扩展可以创建原始类的投影或子类。当你要基于扩展类型添加条件方法或属性时,这可能很有用。

当然,扩展静态方法也是没问题的

复制代码
var zhangsan = Person.Create();

public implicit extension PersonExtension for Person
{
    public static Person Create() => new Person();
}

当然,系统类型也是支持的

复制代码
Console.WriteLine("World".SayHello());

public implicit extension StringExtension for string
{
    public string SayHello() => "Hello" + this;
}

总结

我想这个特性是很大的一个改变,或许可以改进 C# 代码的组织方式,有望提高代码的可读性、可维护性和表现力。

通过允许开发人员在不修改原始代码的情况下向现有类添加功能,它可以促进代码重用并减少修改原始类的需要。

另外据了解,这个特性以及相关特性,例如扩展接口等等,并不会在 C# 13 (.NET 9) 中完整的放出来,而是会在后续版本中逐渐解锁。

相关推荐
我是唐青枫几秒前
C#.NET SpinLock 深入解析:自旋锁原理、使用边界与性能取舍
c#·.net
天空属于哈夫克32 分钟前
拒绝被动响应:企业微信主动调用接口高阶方案
开发语言·python
2501_941982056 分钟前
Go 语言实现企业微信外部群消息主动推送方案
开发语言·golang·企业微信
南山love7 分钟前
spring-boot多线程并发执行任务
java·开发语言
似水明俊德7 分钟前
13-C#.Net-设计模式六大原则-学习笔记
笔记·学习·设计模式·c#·.net
dmlcq11 分钟前
一文读懂 PageQueryUtil:分页查询的优雅打开方式
开发语言·windows·python
不会写DN12 分钟前
JS 最常用的性能优化 防抖和节流
开发语言·javascript·ecmascript
HLC++14 分钟前
数据结构--树
c语言·开发语言·数据结构
2501_9454248015 分钟前
C++构建缓存加速
开发语言·c++·算法
2401_8512729918 分钟前
多平台UI框架C++开发
开发语言·c++·算法