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();
}

结尾

我想这个特性是很大的一个改变,或许可以改进 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

C# 13(.Net 9) 中的新特性 - 扩展类型的更多相关文章

  1. 使用示例带你提前了解 Java 9 中的新特性

    使用示例带你提前了解 Java 9 中的新特性 转载来源:https://juejin.im/post/58c5e402128fe100603cc194 英文出处:https://www.journa ...

  2. ASP.NET 5与MVC 6中的新特性

    差点忘了提一句,MVC 6中默认的渲染引擎Razor也将得到更新,以支持C# 6中的新语法.而Razor中的新特性还不只这一点. 在某些情况下,直接在Web页面中嵌入某些JSON数据的方式可能比向服务 ...

  3. Webpack 3 中的新特性

    本文简短地分享下最新发布的 Webpack 3 中的新特性,供大家参考. 1. Webpack 3 的新特性 6 月 20 日,Webpack 发布了最新的 3.0 版本,并在 Medium 发布了公 ...

  4. HTML 5中的新特性

    HTML 5中的新特性 html5新增了一些语义化更好的标签元素.首先,让我们来了解一下HTML语义化. 1.什么是HTML语义化? 根据内容的结构化(内容语义化),选择合适的标签(代码语义化)便于开 ...

  5. (数据科学学习手札73)盘点pandas 1.0.0中的新特性

    本文对应脚本及数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 毫无疑问pandas已经成为基于Pytho ...

  6. 1 PHP 5.3中的新特性

    1 PHP 5.3中的新特性 1.1 支持命名空间 (Namespace) 毫无疑问,命名空间是PHP5.3所带来的最重要的新特性. 在PHP5.3中,则只需要指定不同的命名空间即可,命名空间的分隔符 ...

  7. 【ElasticSearch】ES5新特性-keyword-text类型-查询区别

    ES5新特性-keyword-text类型-查询区别 elasticsearch-head Elasticsearch-sql client junneyang (JunneYang) es keyw ...

  8. ​Python 3 新特性:类型注解——类似注释吧,反正解释器又不做校验

    ​Python 3 新特性:类型注解 Crossin ​ 上海交通大学 计算机应用技术硕士 95 人赞同了该文章 前几天有同学问到,这个写法是什么意思: def add(x:int, y:int) - ...

  9. Spring Framework 5 中的新特性

    https://www.ibm.com/developerworks/cn/java/j-whats-new-in-spring-framework-5-theedom/index.html Spri ...

  10. JDK8中的新特性

    1.lambda表达式 1.定义 Java 8 发布的最重要新特性.Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中),可以推导出来的就可以省略了,Lambda 表达式免去了使用匿 ...

随机推荐

  1. 羽夏看Linux内核——简述

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你的,如有闲钱,可以打赏支持我的创作.如想转载,请把我的转载信息附在文章后面,并 ...

  2. 07. C语言程序执行流程控制

    [有条件执行语句] if esle 语句 if else 语句根据一个条件确定是否执行一段代码,执行条件是一个布尔值,布尔值为true则执行,为false则不执行,同时可以设置不符合条件时执行的语句. ...

  3. C++ 中 Concept-Model 概念模型

    此文档参考自:https://gracicot.github.io/conceptmodel/2017/09/13/concept-model-part1.html ,觉得很有趣,就翻译过来了 一.C ...

  4. three.js教程2-几何体BufferGeomety顶点

    1.网格模型(三角形概念) 网格模型Mesh其实就一个一个三角形(面)拼接构成.使用使用网格模型Mesh渲染几何体geometry,就是几何体所有顶点坐标三个为一组,构成一个三角形,多组顶点构成多个三 ...

  5. 【AnaTraf 分享】什么是 AnaTraf?为什么设计 AnaTraf?

    网络流量分析与 AnaTraf "2013年,网络流量分析技术(NTA, Network Traffic Analysis)的概念被首次提出,在2016年逐渐兴起.2017年,NTA被Gar ...

  6. 3 个好玩的前端开源项目「GitHub 热点速览」

    单休的周末总是短暂的,还没缓过神新的一周就又开始了.如果你和我一样状态还没有完全恢复,那就让上周好玩的开源项目唤醒你吧! 每周 GitHub 上总是有一些让人眼前一亮的开源项目,上周好玩的前端项目特别 ...

  7. 如此丝滑的API设计,用起来真香

    分享是最有效的学习方式. 博客:https://blog.ktdaddy.com/ 故事 工位上,小猫一边撸着代码,一边吐槽着前人设计的接口. 如下: "我艹,货架模型明明和商品SKU模型是 ...

  8. Ceph配置与认证授权

    目录 Ceph配置与认证授权 1. 为什么现在不采用修改配置文件的方式了呢? 2. Ceph元变量 3. 使用命令行修改配置 3.1 全部修改(使用服务名) 3.2 部分修改(修改进程) 3.3 临时 ...

  9. CSS操作——背景属性

    1.background-color(背景颜色) 页面的背景颜色有四种属性值表示,分别是transparent(透明),RGB十进制颜色表示,十六进制颜色表示和颜色单词表示. 属性使用: /* bac ...

  10. RunnerGo V4.6.0 新增功能介绍

    RunnerGo 最新V4.6.0版本不仅对原有功能进行了深度优化和改进,还新增了一些新功能. UI 插件:浮窗升级,优化浏览体验 此次更新UI插件全新升级至V2.1版本.新版取消了页面内右下角按钮的 ...