c#13新特性

打印 上一主题 下一主题

主题 1878|帖子 1878|积分 5634

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
C# 13 即 .NET 9 按照计划会在2024年11月发布,现在一些新特性已经定型,让我们来预览一个比力大型比力紧张的新特性。
正文
扩展范例 Extension types
在5月份的微软 Build 大会中的 What’s new in C# 13 会议上,两位大佬花了很长的篇幅来演示这个特性。
这个特性一直是大家很关心的,在 github 的 issue 上讨论的也是如火如荼,当然微软也隔了好多年。
起首,让我们往返顾一下 C# 中的扩展方法
  1. using System;
  2. var zhangsan = new Person();
  3. Console.WriteLine(zhangsan.GetAge());
  4. public class Person
  5. {
  6.     public string Name { get; set; } 
  7.     public DateTime Birthday { get; set; }
  8. }
  9. public static class PersonExtension
  10. {
  11.     public static int GetAge(this Person person) => DateTime.Now.Year - person.Birthday.Year;
  12. }
复制代码
以上代码演示了一个扩展方法声明方式及利用方法。
我们在不侵入 Person 类的基础上为 Person 类扩展了一个 GetAge() 的方法,虽然已经可以很方便的扩展出一些方法来,但是问题也是显而易见的,比方必须声明在静态类中、语法看起来很怪异、只能扩展方法而不能扩展属性等等。
于是,在即将到来的 C# 13 中,我们可以这样
  1. var zhangsan = new Person();
  2. Console.WriteLine(zhangsan.GetAge());
  3. public implicit extension PersonExtension for Person
  4. {
  5.     public int GetAge() => DateTime.Now.Year - this.Birthday.Year;
  6. }
复制代码
怎么样,语义是不是清晰了很多?
进一步的,年龄应该是一个属性而不应该是一个方法
  1. var zhangsan = new Person();
  2. Console.WriteLine(zhangsan.Age);
  3. public implicit extension PersonExtension for Person
  4. {
  5.     public int Age => DateTime.Now.Year - this.Birthday.Year;
  6. }
复制代码
困扰多年的如何扩展属性的问题终于得到相识决。
implicit extension / explicit extension
在上一个例子,不知道大家有没有注意到关键字是 implicit extension,那么很显然,会有一个对应的 explicit extension,下面让我们来看看花活
  1. var zhangsan = new Person();
  2. if(zhangsan.IsStudent)
  3. {
  4.     Student zhangsanAsStudent = zhangsan;
  5.     Console.WriteLine(zhangsanAsStudent.Grade);
  6. }
  7. public implicit extension PersonExtension for Person
  8. {
  9.     public int Age => DateTime.Now.Year - this.Birthday.Year;
  10.     public bool IsStudent => this.Age < 18;
  11. }
  12. public explicit extension Student for Person
  13. {
  14.     public string Grade => "五年级";
  15. }
复制代码
可以看到,这里有一个表现扩展,显式扩展可以创建原始类的投影或子类。当你要基于扩展范例添加条件方法或属性时,这大概很有用。
当然,扩展静态方法也是没问题的
  1. var zhangsan = Person.Create();
  2. public implicit extension PersonExtension for Person
  3. {
  4.     public static Person Create() => new Person();
  5. }
复制代码
当然,系统范例也是支持的
  1. Console.WriteLine("World".SayHello());
  2. public implicit extension StringExtension for string
  3. {
  4.     public string SayHello() => "Hello" + this;
  5. }
复制代码
总结

我想这个特性是很大的一个改变,或许可以改进 C# 代码的构造方式,有望提高代码的可读性、可维护性和体现力。
通过答应开发人员在不修改原始代码的情况下向现有类添加功能,它可以促进代码重用并减少修改原始类的需要。
另外据相识,这个特性以及相关特性,比方扩展接口等等,并不会在 C# 13 (.NET 9) 中完备的放出来,而是会在后续版本中渐渐解锁。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

怀念夏天

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表