新特性(原文地址)
自动完成属性的增强
自动完成属性在 C# 3 都已经出来了,如果需要把一个属性设置成只读的,我们会这样写public string Name { get; private set; }
。但这样只能保证对外是只读的,在类的内部还是可以修改的。
在 C# 6 这样实现:public string Name { get; }
public ClassName(string name) { this.Name = name; }
只允许你在类的构造函数中赋值,这就实现了真正意义的只读
PS: 请注意只读和常量的区别
字符串格式化
public String FullName => $ "{FirstName} {MiddleName} {LastName}"
这类似于 ES6 中的模板字符串,FirstName / MiddleName / LastName皆为属性名
PS:$与后面的双引号之间没有空格,连在一起Markdown的语法不支持,故分开
只导入静态成员
using static YourClass
导入指定类中的静态成员。当你只需要用到巨型命名空间下的某个类的时候,这将非常有用。
空值操作
var result = Handlerame()?.FullName;
这里即使 Handler()
返回的是空,也不会报错。还记得那些年我们写的 if
判断吗?
体函数成员表达式
当函数体只有一句的时候使用此特性节省了代码量
重写 ToString()
public override string ToString() => $ "{FirstName},{MiddleName},{LastName}"
上面的字符串格式化在赋值时候也用到了此特性
异常过滤
try {
} catch(MyException ex) when (ex.Code==403){
return "Forbidden";
}
重点就在catch
后面的when
,只有when
后面的条件为true, 才会进入该异常分支
nameof
表达式
nameof(memberName)
返回成员名称,而非限定名
暂时没发现有多大用处,用过的小伙伴帮忙补充下
在catch
和finally
语句块中加入了await
public static async Task<string> MakeRequestAndLogFailures(){
try {
var responseText = await streamTask;
return responseText;
} catch (MyException e) when (e.Code==403){
await logError("Recovered from redirect", e);
return "Site Moved";
}finally
{
await logMethodExit();
client.Dispose();
}
}
这个在 C# 5 出来的异步,大大简化了代码量,关于async
和await
请查阅文档
字典类索引初始化
private Dictionary<int, string> webErrors = new Dictionary<int, string>
{
[404] = "Page not Found",
[302] = "Page moved, but left a forwarding address.",
[500] = "The web server can't come out to play today."
};
大大增强了代码的可读性
方法重载的解决方案
当方法同时可以接收 Action
和 Func
的时候,使用 Func
优于 Action
C#
总能带来一些惊喜。外行的人看到的是语法糖,内行的人注重的是语言的设计思想
下一篇看下C#7又有哪些好东东
注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。