首页 火币交易所文章正文

C# 二十年语法变迁之 C# 5 和 C# 6参考

火币交易所 2022年10月21日 11:02 69 Connor

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)};}

• “尝试使用集合初始化程序时添加扩展方法”

发表评论

火币交易所(huobi) | 火币全球站官网入口 备案号:川ICP备66666666号