惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

aimingoo的专栏
aimingoo的专栏
Google DeepMind News
Google DeepMind News
S
SegmentFault 最新的问题
Project Zero
Project Zero
D
DataBreaches.Net
I
InfoQ
L
Lohrmann on Cybersecurity
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
酷 壳 – CoolShell
酷 壳 – CoolShell
Stack Overflow Blog
Stack Overflow Blog
The Register - Security
The Register - Security
Recorded Future
Recorded Future
Vercel News
Vercel News
博客园 - 司徒正美
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
I
Intezer
The Hacker News
The Hacker News
F
Fortinet All Blogs
Microsoft Azure Blog
Microsoft Azure Blog
P
Proofpoint News Feed
Help Net Security
Help Net Security
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Scott Helme
Scott Helme
T
Threatpost
爱范儿
爱范儿
N
Netflix TechBlog - Medium
D
Docker
云风的 BLOG
云风的 BLOG
C
Cisco Blogs
K
Kaspersky official blog
H
Help Net Security
S
Secure Thoughts
T
Threat Research - Cisco Blogs
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
S
Security @ Cisco Blogs
Cyberwarzone
Cyberwarzone
N
News and Events Feed by Topic
G
Google Developers Blog
Forbes - Security
Forbes - Security
博客园 - 三生石上(FineUI控件)
博客园 - 叶小钗
B
Blog
Google DeepMind News
Google DeepMind News
Recent Announcements
Recent Announcements
Simon Willison's Weblog
Simon Willison's Weblog
S
Securelist
P
Privacy International News Feed
Spread Privacy
Spread Privacy
The Last Watchdog
The Last Watchdog

博客园 - Rwing

C# 13(.Net 9) 中的新特性 - 半自动属性 [翻译].NET 8 的原生AOT及高性能Web开发中的应用[附性能测试结果] 如何在 Docker 环境下自动给 .NET 程序生成 Dump [翻译] 预览 C# 10 的新东西 [翻译]正式宣布 Visual Studio 2022 [翻译]Azure 网关迁移至 .NET Core 3.1 性能提升一倍 C# 9.0 新特性预览 - init-only 属性 C# 9.0 新特性预览 - 顶级语句 C# 9.0 新特性预览 - 空参数校验 C# 9.0 新特性预览 - 类型推导的 new - Rwing [翻译] 使用 Serverless 和 .NET Core 构建飞速发展的架构 - Rwing [翻译] .NET Core 3.0 RC 1 发布 - Rwing [翻译] .NET Core 3.0 Preview 9 发布 - Rwing [翻译] .NET Core 3.0 Preview 7 发布 - Rwing [翻译] C# 8.0 接口默认实现 - Rwing [翻译] 正式宣布 .NET 5 - Rwing [翻译] ASP.NET Core 利用 Docker、ElasticSearch、Kibana 来记录日志 - Rwing [翻译] Visual Studio 2019: 极速编码. 智能工作. 创造未来. - Rwing [翻译] 使用 .NET Core 3.0 创建一个 Windows 服务 - Rwing
C# 13(.Net 9) 中的新特性 - 扩展类型
Rwing · 2024-06-21 · via 博客园 - Rwing

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) 中完整的放出来,而是会在后续版本中逐渐解锁。

参考

https://build.microsoft.com/en-US/sessions/689e5104-72e9-4d02-bb52-77676d1ec5bc?source=sessions
https://devblogs.microsoft.com/dotnet/dotnet-build-2024-announcements/
https://github.com/dotnet/csharplang/issues/5497