四月的第一天,京城天气十分怡人,春和景明,晴朗舒适。北京市气象台1日14时发布:今天下午晴转多云,偏南风三级左右,阵风五级,最高气温19℃;夜间多云转...
2026-04-01 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)};}
• “尝试使用集合初始化程序时添加扩展方法”
相关文章
四月的第一天,京城天气十分怡人,春和景明,晴朗舒适。北京市气象台1日14时发布:今天下午晴转多云,偏南风三级左右,阵风五级,最高气温19℃;夜间多云转...
2026-04-01 3
广州市应急管理局3月31日公布了《广州从化“10·20”较大道路交通事故调查报告》。 2025年10月20日13时43分许,从化区285县道与左灌渠...
2026-04-01 4
十年试点,长护险即将全面铺开。 3月25日,《关于加快建立长期护理保险制度的意见》(以下简称《意见》)出台。当中提到,用3年左右时间,基本建立适应我国...
2026-03-27 4
48小时最后通牒已过,特朗普却在最后一刻犯了怂,下令延迟五天。随后又抛出一场自导自演的大戏,没想到的是,伊朗一点面子都没给。 特朗普宣布推迟 特朗普给...
2026-03-27 8
近日,山东威海一母亲带刚看完牙的两个女儿去买鞋,因大女儿看中一双599元的鞋子,但价格超过预期,母亲在店外犹豫半小时,最终咬牙买下,并带女儿们吃了一顿...
2026-03-20 9
图片来源:视觉中国 界面新闻记者 | 翟瑞民 2026年3月20日,中央纪委国家监委网站发布消息,重庆市委副书记、市长胡衡华涉嫌严重违纪违法,目前正接...
2026-03-20 4
2026年3月20日,北京市第二中级人民法院一审公开宣判山西省政协原党组书记、主席吴存荣受贿案,对被告人吴存荣以受贿罪判处无期徒刑,剥夺政治权利终身,...
2026-03-20 6
3月19日,有游客在参观上海科技馆时发现,馆内二楼介绍物理学家麦克斯韦的展板存在多处明显错别字和标点使用不当、排版混乱的问题,如“爱丁堡”错写成”爱于...
2026-03-20 3
发表评论