过去几个月,俄乌战场的态势发生了一个根本性变化。 不是某个村庄的易手,不是某条战线的推进,而是一个整体趋势的逆转:俄罗斯自2024年1月以来,首次净失...
2026-05-27 3
C# 二十年语法变迁之 C# 5 和 C# 6参考
/
自从 C# 于 2000 年推出以来,该语言的规模已经大大增加,我不确定任何人是否有可能在任何时候都对每一种语言特性都有深入的了解。因此,我想写一系列快速参考文章,总结自 C# 2.0 以来所有主要的新语言特性。我不会详细介绍它们中的任何一个,但我希望这个系列可以作为我自己(希望你也是!)的参考,我可以不时回过头来记住我使用的工具工具箱里有。:)
开始之前的一个小提示:我将跳过一些更基本的东西(例如 C# 2.0 引入了泛型,但它们的使用范围如此广泛,以至于它们不值得包括在内);而且我还可以将一些功能“粘合”在一起,以使其更简洁。本系列并不打算成为该语言的权威或历史记录。相反,它更像是可能派上用场的重要语言功能的“备忘单”。
C# 5.0 Async/await
此功能是 C# 的支柱,对行业产生了如此大的影响,以至于它已进入其他主流语言。有无数的教程和书籍深入到这个特性;但这篇文章只是作为一个快速参考指南,所以我只在这里总结一下。
Async/await 允许方法使用异步但以同步方式编写:
// Once we're here, we're executing the continuationreturnuserDetails.Age;}
Caller Info 属性
此功能涉及可应用于可选方法参数的三个属性。然后编译器将填写详细信息;这些主要用于记录:
staticvoidTest{Log("My message");// Will print something like "My message (called from Test on line 15 in file C:\...\Example.cs)"}
• “Caller Info 属性”
C# 6.0 静态导入Static Imports
此功能允许在不使用类名的情况下在类上使用静态方法:
staticvoidTest{WriteLine("hello");// No Console. prefix required}
• “静态导入”
异常过滤器
异常过滤器仅在满足某些参数时才允许捕获异常:
展开全文
• “异常过滤器”
不可变的自动属性
此功能允许从自动属性中省略设置器以使其不可变:
publicMyClass(stringname){Name=name;// Can be initialized in constructor}}
• “Immutable Auto-Properties” 名称不能从构造函数以外的任何地方设置(或内联,请参阅下一个功能)。
自动属性初始化器
这允许在其声明点为内联属性设置初始值:
• “自动属性初始化程序”
表达体成员
此功能允许将某些函数体编写为单行表达式:
// PrintAge is a method, the code to the right of the '=>' is executed when the function is invokedpublicvoidPrintAge=>Console.WriteLine(Age);}
• “表达式主体成员” 在 C# 7.0 中添加了一些进一步的支持:
// Property getter and setterpublicintAge{get=>_age;set=>_age =value >=0??value :thrownewArgumentOutOfRangeException(nameof(value));
// ConstructorpublicMyClass(intage)=>Age=age;
// Finalizer~MyClass=>ResourceManager.NotifyFinalizedMyClass(this);}
• “更多表达主体的成员”
空传播(“Elvis”运算符)
如果该对象不为空,则此运算符允许您访问该对象的成员;或者简单地将所有值折叠为 null 否则:
staticvoidTest{PrintUserName(newUserDetails("Ben",30));// Prints "Name: Ben, Age: 30"PrintUserName(null);// Prints "Name: No name, Age: No age"}
• “空条件运算符” 当将多个属性/方法/字段调用链接在一起时(即var x = a?.B?.C?.D),如果链中的任何单个元素为 null,则整个表达式将返回 null。
字符串插值(和格式化字符串)
到目前为止,这是我已经在各种示例中使用的功能。字符串插值允许以更自然的方式将变量嵌入到字符串中:
• “基本字符串插值” 可以通过格式后缀指定值转换为字符串的方式。以下示例显示了在将浮点值转换为字符串时指定小数位数的一种方法:
• “格式化字符串插值” 也可以指定对齐方式;用于打印 ASCII 表:
for(vari =0;i <3;++i){Console.WriteLine($"Name: {names[i],10} | Food: {favoriteFoods[i]}");// Notice the ,10 that right-aligns names to a 10-column width}}
/* Prints:*Name:Ben|Food:Ramen*Name:Javier|Food:SomethingVegetarian*Name:Chris|Food:Noidea*/
staticvoidTest{varnames =new[]{"Ben","Javier","Chris"};varfavoriteFoods =new[]{"Ramen","Something Vegetarian","No idea"};
for(vari =0;i <3;++i){Console.WriteLine($"Name: {names[i],-10} | Food: {favoriteFoods[i]}");// Notice the ,-10 that left-aligns names to a 10-column width}}
/* Prints:*Name:Ben|Food:Ramen*Name:Javier|Food:SomethingVegetarian*Name:Chris|Food:Noidea*/
• “对齐字符串插值” 对象的默认格式使用线程本地文化作为格式提供程序。有时这不是我们想要的。因此,我们可以通过显式创建FormattableString然后将其转换为字符串来手动指定格式提供程序:
Console.WriteLine(str.ToString(CultureInfo.GetCultureInfo("de-DE")));// Prints "Percentage complete: 12,35%" (German-style number formatting)}
• “FormattableString”
"nameof" 运算符
这个小功能允许您将代码中的标记名称转换为字符串。它很有用,因为它避免了在重命名这些类型时手动写出成员/类型名称的问题:
publicUser(stringname){if(name ==null)thrownewArgumentNullException(nameof(name));// If we rename name later this will not compile (which is good)Name=name;}}
• “nameof”
关联集合的替代初始化语法
这是一个小功能。它允许使用更简洁的语法来初始化关联集合(即主要是字典)。以下两个初始化是相同的:
varnewWay =newDictionary<int,string>{[1]="One",[2]="Two",[3]="Three",[4]="Four"};}}
•“旧字典初始化与新字典初始化” 字典键和值可以是任何类型。
集合初始化器的扩展“添加”方法
假设您正在使用的库中定义了一个集合类型(必须实现IEnumerable<> );但是添加元素的方法没有命名为Add(T item)。这是集合初始化器工作的要求。
下面是一个使用名为UserDatabase的虚构类型的示例,该类型从虚构的第三方库中实现IEnumerable :
// Will compile but less prettyvardatabase =newUserDatabase;database.AddUser(newUser("Ben",30));database.AddUser(newUser("Seb",27));database.AddUser(newUser("Rob",33));}
• “尝试使用集合初始化程序时没有添加方法” 在这种情况下,从 C# 6.0 开始,我们可以指定Add(T item)扩展方法来启用集合初始值设定项:
staticvoidTest{// Hooray, this works now!vardatabase =newUserDatabase{newUser("Ben",30),newUser("Seb",27),newUser("Rob",33)};}
• “尝试使用集合初始化程序时添加扩展方法”
相关文章
过去几个月,俄乌战场的态势发生了一个根本性变化。 不是某个村庄的易手,不是某条战线的推进,而是一个整体趋势的逆转:俄罗斯自2024年1月以来,首次净失...
2026-05-27 3
近年来,越来越多的科技公司、互联网公司CEO不再满足于在发布会上演讲,而是更生活化,直接走到台前。像黄仁勋那样逛街、喝豆汁,已经算是体面的整活方式了...
2026-05-27 6
韩国海军正式启动引进核潜艇的计划,无疑在东亚乃至全球范围内都引发了巨大的波澜。是什么原因让韩国在此刻选择加速这一军事化进程? 韩国决定推进核潜艇计划的...
2026-05-27 7
小米宝宝空调外机(来源:受访者) 信网·信号新闻5月19日讯近日,深圳市民柯先生向信号新闻(0532-80889431)反映,其在电商平台购买了一...
2026-05-20 3
【文/观察者网 山猫】 据印度尼西亚总统府官方网站报道,当地时间5月18日,印尼国民军(TNI)当天在雅加达哈利姆·珀达纳库苏马空军基地举行了“主要...
2026-05-20 3
枪手加冕,新王当立 在曼城客场挑战伯恩茅斯的比赛中,主队凭借朱尼尔·克鲁皮的进球以1-1战平曼城,这一结果直接宣告阿森纳提前锁定本赛季英格兰足球超级联...
2026-05-20 4
据大河报,5月20日凌晨,@汪涵 就电影《监狱来的妈妈》相关争议发布声明:有关我担任电影《监狱来的妈妈》出品人一事,本人特此声明。本人初衷为扶持文艺创...
2026-05-20 3
美国国会参议院19日以50票赞成、47票反对的表决结果,推进一项旨在限制总统特朗普动武权力的法案,要求特朗普今后对伊朗采取任何军事行动必须获得国会批准...
2026-05-20 4
发表评论