C# 10 新特性 —— 补充篇

C# 10 新特性 —— 补充篇

Intro

前面已经写了几篇文章介绍 C# 10 新特性的文章,还有一些小的更新

Constant interpolated strings

在之前的版本中,如果想要使用插值字符串来,则不能声明为一个常量

如果依赖于一个常量的插值字符串就只能声明为一个 static 的变量,比如说下面这个例子:

private const string Name = "Alice";
private static readonly string Hello = $"Hello {Name}";

在 C# 10 中我们可以将 Hello 也声明为常量(const),如下:

public string const Name = "Alice";
public string const Hello = $"Hello {Name}";

这种常量插值字符串参数只适用于字符串,如果是 int 就不行了,比如说,如果写一段下面这样的代码:

private const int Num = 10;
private const string HelloNum = $"Hello {Num}";

这里插值字符串的参数是一个 int 类型,实际编译器会直接报错,报错信息如下:

// Error   CS0133  The expression being assigned to 'ConstantInterpolatedStringSample.HelloNum' must be constant

上一篇文章中,我们有提到像 int/DateTime 等这种数据字符串插值是会依赖当前的一个 CultureInfo,所以作为插值字符串的时候不是一个编译时就确定的一个值,不能被认为是常量

这个特性的插值参数必须是字符串常量。

Extended property patterns

C# 10 针对模式匹配有一点小优化,针对嵌套的属性模式写法做了一些简化,如:

if (e is MethodCallExpression { Method: { Name: "MethodName" } })

C# 10 新写法:

if (e is MethodCallExpression { Method.Name: "MethodName" })

一个完整的简单小例子如下:

record TestModelA(TestModelB B, string Name);
record TestModelB(TestModelC C, string Name);
record TestModelC(string Name);var a = new TestModelA(new TestModelB(new TestModelC("C"), "B"), "A");
if (a is { B.C.Name.Length: > 0 })
{Console.WriteLine(a.B.C.Name);
}

Record types can seal ToString

在 C# 10 中我们可以把 record 类型的 ToString() 方法标记为 sealed,这样继承于它的子类就不能再重写这个方法了,可以用来保护 ToString() 输出的格式,保证输出的格式是一致的,使用起也很简单,直接在 ToString 方法中声明 sealed 即可,示例如下:

record Person(string Name, int Age)
{public sealed override string ToString(){return Name;}
}

这样如果继承于它的 record 想要重写 ToString 方法的时候就会报错

89cd4ddc4da9eb01ecb163080e44d74e.png

前面我们提到过 C# 10 中增加了 record struct,它可以使用这个特性吗?答案是不可以,这一特性仅针对于 record class,在 record struct 中使用会得到一个类似下面的错误

2b9cf3a81086fc5eb7aa6dc86ee2c4f7.png

Assignment and declaration in same deconstruction

在之前的版本中,我们如果想要使用 tuple 返回值,必须要同时初始化,如下:

private static (int month, int day) GetDate()
{var today = DateTime.Today;return (today.Month, today.Day);
}(var month, var day) = GetDate();
Console.WriteLine($"Month: {month}, day: {day}");

我们必须要同时声明 month/day,在 C# 10 中我们既可以使用已有变量又可以声明新的变量,可以结合在一起使用,如下:

(var month, var day) = GetDate();
Console.WriteLine($"Month: {month}, day: {day}");(month, var day2) = GetDate();
Console.WriteLine($"Month: {month}, day: {day2}");(month, day) = GetDate();
Console.WriteLine($"Month: {month}, day: {day}");

Improved definite assignment

C# 10 中编译器会做更多的推断从而大大方便我们的使用,之前介绍的 Lamdba 的一些优化都是由编译器做的推断,针对于初始化赋值的 null 检查也有一些优化,下面是微软给出的一个示例,在之前的版本中会有警告,但是在 C# 10 之后就没有警告了

string representation = "N/A";
if ((c != null && c.GetDependentValue(out object obj)) == true)
{representation = obj.ToString(); // undesired error
}// Or, using ?.
if (c?.GetDependentValue(out object obj) == true)
{representation = obj.ToString(); // undesired error
}// Or, using ??
if (c?.GetDependentValue(out object obj) ?? false)
{representation = obj.ToString(); // undesired error
}

Allow AsyncMethodBuilder attribute on methods

从 C# 10 开始我们可以在异步方法上设置 AsyncMethodBuild 来自定义要处理异步任务的方式,这有对于要实现性能更好的异步方法处理方式的用户会更加的方便

比如这样一个异步方法:

public async ValueTask<T> ExampleAsync() { ... }

实际编译器会生成这样的代码:

[AsyncStateMachine(typeof(<ExampleAsync>d__29))]
[CompilerGenerated]
static ValueTask<int> ExampleAsync()
{<ExampleAsync>d__29 stateMachine;stateMachine.<>t__builder = AsyncValueTaskMethodBuilder<int>.Create();stateMachine.<>1__state = -1;stateMachine.<>t__builder.Start(ref stateMachine);return stateMachine.<>t__builder.Task;
}

使用这种方式,我们可以控制异步方法的处理

[AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder<>))] // new usage, referring to some custom builder type
static async ValueTask<int> ExampleAsync() { ... }

这样实际生成的代码类似下面这样

[AsyncStateMachine(typeof(<ExampleAsync>d__29))]
[CompilerGenerated]
[AsyncMethodBuilder(typeof(PoolingAsyncValueTaskMethodBuilder<>))] // retained but not necessary anymore
static ValueTask<int> ExampleAsync()
{<ExampleAsync>d__29 stateMachine;stateMachine.<>t__builder = PoolingAsyncValueTaskMethodBuilder<int>.Create(); // <>t__builder now a different typestateMachine.<>1__state = -1;stateMachine.<>t__builder.Start(ref stateMachine);return stateMachine.<>t__builder.Task;
}

更多细节可以参考:

https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/async-method-builders

Generic Attribute

Generic Attribute 目前还不算是 C# 10 新特性中的一部分,但是已经可以使用了,需要声明 LangVersionpreview,否则会看到类似下面的一个错误

36676b36b74db13f0e2e0d371aac8e9b.png

Generic Attribute Requires preview LangVersion

因为可以用了,而且想在我的项目里使用,所以想尝试一下,但是就目前来说,还不能满足我的需要,简单看一下好了

我们可以这样用

[ExcelConfiguration<TestModel>]
public class TestModel
{public int Id { get; set; }public string Title { get; set; } = string.Empty;
}[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct)]
public class ExcelConfigurationAttribute<T> : Attribute
{public string DefaultFileName { get; set; } = "unnamed-file.xlsx";public Func<T, bool> DataValiadator { get; set; } = _ => true;
}

但是如果想在声明 Attribute 的地方指定泛型委托会报错,错误信息如下:

'DataValiadator' is not a valid named attribute argument because it is not a valid attribute parameter type

52af3946be5037385a57e90ac39d8488.png

Generic Lambda Error

类似的还有一个 Generic Math 的功能也可以预览使用,但是对我来说感觉意义不是特别大,所以就不介绍了,感兴趣的可以参考:https://devblogs.microsoft.com/dotnet/preview-features-in-net-6-generic-math/

对于预览版特性,如果不是特别需要建议还是不要轻易在生产代码里用,以后被砍了就尴尬了

More

原来有很多原本计划在 C#10 的特性被推到了 C# 11中,比如 filed 关键词、required 成员针对集合的模式匹配等,但总体来说还是有很多不错的新特性了,还没用 C# 10 的小伙伴们可以用起来了~~

C# 10 新特性解析的系列文章到此就结束了,如果有错误的地方欢迎指出,万分感谢

C# 10 新特性的示例代码可以从 Github 上获取:https://github.com/WeihanLi/SamplesInPractice/tree/master/CSharp10Sample

更多特性介绍可以参考微软的文档,可以参考文末的参考链接

References

  • https://docs.microsoft.com/en-us/dotnet/csharp/whats-new/csharp-10

  • https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/constant_interpolated_strings

  • https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/extended-property-patterns

  • https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/improved-definite-assignment

  • https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/proposals/csharp-10.0/async-method-builders

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294944.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

达内TTS6.0课件oop_day01

转载于:https://www.cnblogs.com/suncoolcat/p/3329114.html

过年前谈个恋爱很过分吗?

1 小盆友的广东口音有多好玩&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 今年你进步了吗&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 收到课本的丁真&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 上海业主…

打独立运行包遇到无法trim咋解决

背景介绍工作中我用到kotlin写代码&#xff0c;在orm上ktorm是一款非常优秀的操作db的框架&#xff0c;我喜欢用它所以我写了一个插件能够增加我的工作效率&#xff0c;这款idea插件的主体逻辑是.net开发的(没错是跨平台的.net)。因为db-schema的解析逻辑我很在以前写的一个vis…

用html制作班级课程表实例,在网页制作中用表格制作一张课程表如下图。

侠客岛的含笑 Document (2013)学年第(2)学期 课程表上午一&nbsp下午三&nbsp晚上五&nbsp

打破校史!这位参与发表学校首篇Science的博士小姐姐,近日一作再发Nature

全世界只有3.14 % 的人关注了爆炸吧知识本文由科研大匠&#xff08;Id:keyandajiang&#xff09;综合整理自西南交大新闻网、官微、扬华研究生新闻中心导读&#xff1a;12月10日&#xff0c;Nature发表了西南交通大学材料科学与工程学院博士毕业生杨倩&#xff08;现为英国曼彻…

2022版Win11重磅升级!

微软宣布 Windows 11 2022 年更新将重点改进 WinUI 的性能。包括但不限于 Windows 11 文件资源管理器的启动速度、右键桌面、日期和时间弹出、音量调整、操作中心和通知中心等响应体验等。WinUI 的全称为Windows UI 库&#xff0c;是适用于 Windows 桌面应用程序和 UWP 应用程序…

Mysql Engine【innodb,myisam】

2019独角兽企业重金招聘Python工程师标准>>> Innodb,Myisam都是Mysql数据库存储的引擎&#xff0c;Innodb支持事务等数据库高级特性&#xff0c;Myisam不支持&#xff0c;但比较快速。 ISAM 是一个定义明确且历经时间考验的数据表格管理方法&#xff0c;它在设计时就…

ALV Styles in Field catalogue using OOPS

转自http://www.saptechnical.com/Tutorials/ALV/Styles/demo.htm By Swarna S, Tata Consultancy Services *&---------------------------------------------------------------------* *& Report ZALV_STYLES * *…

自称“房奴”的博士靠开店卖SCI论文10年盈利近百万,论文买卖你怎么看?

全世界只有3.14 % 的人关注了爆炸吧知识本文来源&#xff1a;中国青年报、武汉晚报 首席记者杨佳峰导读&#xff1a;10年前&#xff0c;一位自称“房奴博士”的刚毕业博士生在网上开启了他的SCI售卖小铺。每篇 1-2 万元&#xff0c;声称一年内卖出去的论文中有 8 篇都进了SCI索…

既生瑜何生亮 access_token VS refresh_token

中国有句老话, 既生瑜何生亮, 既然有我周瑜在世, 为什么老天还要一个诸葛亮啊&#xff1f;同样的, 众所周知, 在 OAuth 2.0 授权协议中, 也有两个令牌 token , 分别是 access_token 和 refresh_token, 为什么已经有了 access_token, 还需要 refresh_token 呢?我们先看下面两者…

关于计算机软件系统的知识,二、计算机软件系统基本知识

一、计算机软件系统图示咱们先来直观的看一下&#xff0c;我就直接上图了打开今日头条&#xff0c;查看更多精彩图片计算机软件系统(一)系统软件在说系统软件之前我想用一张图让大家清晰的了解下&#xff0c;计算机硬件系统与软件系统的关系&#xff1a;计算机硬件系统与软件系…

Nature评选年度十大科学发现:北师大博士凭借天眼研究入选!

全世界只有3.14 % 的人关注了爆炸吧知识本文来源&#xff1a;Bio生物世界、北京师范大学新闻网、百度百科、北京师范大学官网近日&#xff0c;Nature 盘点了2020年度十大科学发现&#xff0c;这其中即包括新冠病毒研究、冷冻电镜突破、压力导致白发的原因、HIV治疗、银河系中的…

Android之集成友盟推送功能

友盟是中国最大的移动开发者服务平台,为移动开发者提供免费的应用统计分析、社交分享、消息推送、自动更新、在线参数、移动推广效果分析、微社区等app开发和运营解决方案。 如何快速集成友盟推送功能&#xff1a; 1. 注册友盟账号 友盟开发者账号的注册地址:http://www.umeng.…

Win11手机应用大改!全新界面来袭

在 Windows 11 中&#xff0c;应用商店、画图、照片、计算器等系统内置应用都获得了全新的改进&#xff0c;这回终于轮到你的手机应用了。在今年 9 月的微软 Windows 11 硬件暨全新 Surface 设备发布会上&#xff0c;微软曾简要地展示了 Windows 11 内置应用 Your Phone&#x…

serialization机制

首先说明一下序列化的知识&#xff1a; java中的序列化(serialization)机制能够将一个实例对象的状态信息写入到一个字节流中&#xff0c;使其可以通过socket进行传输、或者持久化存储到数据库或文件系统中&#xff1b;然后在需要的时候&#xff0c;可以根据字节流中的信息来重…

java2的7次方怎么表示_静态市盈率要怎么看?

静态市盈率是估值一个公司质地的指标&#xff0c;同时它也就是大家常说的市盈率。它体现的是一个企业按照目前的盈利水平&#xff0c;我们买入后需要多长时间才能回本。那么静态市盈率高好还是低好呢&#xff1f;静态市盈率低好&#xff0c;高就意味着该股高估了。静态市盈率是…

中国科幻扛鼎之作,原来真的不止刘慈欣

▲ 点击查看50年前的某天&#xff0c;一个小孩和一群大人一起仰望着晴朗的天空&#xff0c;看着中国第一颗人造卫星“东方红一号”&#xff0c;默默地担心它会撞到其他星星。而这份小小的担心&#xff0c;成了他后来开始创造科幻的动力和梦想。这个仰望晴空的小孩叫刘慈欣。如果…

程学旗 计算机,徐明伟-青年科学家奖-中国计算机学会

2010CCF青年科学家奖获奖者徐明伟 教授清华大学分别于1994年和1998年在清华大学计算机科学与技术系获工学学士和工学博士学位。现为清华大学计算机系教授&#xff0c;博士生导师&#xff0c;网络所所长&#xff0c;计算机学会YOCSEF AC委员&#xff0c;中国通信标准化协会技术管…

.net6给winform带来的新功能

首先简化了Program文件&#xff0c;引入了全局命名空间&#xff0c;但顶级语句由于Main函数的特性[STAThread]没有引用进来。namespace WinFormsDemo {internal static class Program{/// <summary>/// The main entry point for the application./// </summary>[…

男生的哪个“不要”是真的不要?

1 每天一个被炒小技巧&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 今天你能接到水算我输&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 如何形容自己没钱&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 猜中了开头没猜中结…