首页 > 编程语言 >C# 13(.Net 9) 中的新特性 - 扩展类型

C# 13(.Net 9) 中的新特性 - 扩展类型

时间:2024-06-21 23:10:56浏览次数:24  
标签:13 extension C# 扩展 Person Net zhangsan public

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

标签:13,extension,C#,扩展,Person,Net,zhangsan,public
From: https://www.cnblogs.com/Rwing/p/18261641/Csharp_13_dot_net_9_preview_extension_types

相关文章

  • ASCII 码表 unicode表 utf8表
     ASCII码表只包含0到127的字符表示,用单个字节即可表示。而对于超过127的字符,比如0x9A,无法用ASCII码表表示。对于超过ASCII码表的字符,可以使用其他字符编码表来表示,如Unicode编码表。Unicode是一种用于表示所有字符的标准编码系统,它包含了全球范围内的字符集,......
  • 学习Angr记录--angr_ctf 00~05
    首先,下载angr_ctf,打开dist文件夹,这里才是练习题,然后solution是答案00.find01.avoid前面两个是基础操作复习一下流程:1.项目路径2.进入状态3.模拟器模拟进入状态时的环境4.模拟器explore,find一个地址,avoid一些地址5.simulation.found[]数组存储成功的输入6.print(solutio......
  • 【Mac 从 0 到 1 保姆级配置教程 03】 - 安装配置美化 iterm2 一气呵成,Mac 下经久不衰
    1.前言如果你让我给别人推荐一款Mac下的终端,那我会毫不犹豫的推荐iterm2,因为它足够经典,足够好用。当然优秀的终端有很多,比如:alacritty、kitty等,大家感兴趣的可以尝试一下。我们今天主要讲解iterm2的安装、配置和美化。2.安装iterm2brewinstall--caskiterm......
  • FreeBSD通过CBSD管理低资源容器jail 网络NAT配置
    jail容器里的系统有时候并不需要公开的地址,所以给它们配置内网地址即可。但是这些系统一般都有上网的需求,这时候可以使用nat进行解决。CBSD可以配置NAT规则,只需要命令cbsdnatcfg,配置好后cbsdnaton启动即可:%cbsdnatcfgConfigureNATforRFC1918Network?[yes(1)orn......
  • 面试题(TCP/IP协议)详解三次握手
    TCP/IP协议中的三次握手我们首先来了解一下TCPTCP(TransmissionControlProtocol,传输控制协议)是一个面向连接的、可靠的、基于字节流的传输层通信协议。以下是TCP的一些主要特点:面向连接:在数据传输之前,TCP必须先建立连接(三次握手),在数据传输结束后,还要终止这个连接(......
  • 阐述Spring Security概念及其运用于实战
    SpringSecurity(安全校验)1.概述SpringSecurity是Spring项目组提供的安全服务框架,核心功能包括认证和授权.为系统提供了声明式安全访问控制功能,减少了为系统安全而编写大量重复代码的工作.在如今开发模式中,SpringSecurity已经成为Java程序员必备的一项技术,简化认......
  • c语言 字符串操作函数
    字符串操作函数1.strlen()函数strlen()函数用于计算字符串的长度,返回字符串的字符数。语法:size_tstrlen(constchar*str)参数:str–要计算长度的字符串。返回值:字符串的字符数。示例:#include<stdio.h>#include<string.h>intmain(){charstr[50]="......
  • css--字体图标
            在前端开发与设计过程中我们会需要用到一些大家都耳熟能详的小图标,如果插入图片的话色彩.大小.背景等一切的设计都会有较大的影响,所以我们往往会引入矢量图.        1.我们在阿里巴巴矢量库中选择自己想要的图标放入"购物车"中,点击"下载代码"解压......
  • C语言 内存操作函数
    内存管理进程空间程序,是经源码编译后的可执行文件,可执行文件可以多次被执行,比如我们可以多次打开office。而进程,是程序加载到内存后开始执行,至执行结束,这样一段时间概念,多次打开的wps,每打开一次都是一个进程,当我们每关闭一个office,则表示该进程结束。程序是静态概......
  • PCL 拟合二维椭圆(迭代法)
    文章目录一、简介二、实现代码三、实现效果参考资料一、简介一般情况,我们会用椭圆拟合二维点,用椭球拟合三维点。在n维中,这些对象被称为超椭球体,由二次方程隐式定义超椭球的中心是n×1向量C,n×n矩阵S是正定的,n×1向量X是超椭球上的任意点。矩阵S可以用特......