新特性(原文地址)

自动完成属性的增强

自动完成属性在 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)
返回成员名称,而非限定名
暂时没发现有多大用处,用过的小伙伴帮忙补充下

catchfinally语句块中加入了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 出来的异步,大大简化了代码量,关于asyncawait请查阅文档

字典类索引初始化

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."
};

大大增强了代码的可读性

方法重载的解决方案

当方法同时可以接收 ActionFunc 的时候,使用 Func 优于 Action

C#总能带来一些惊喜。外行的人看到的是语法糖,内行的人注重的是语言的设计思想

下一篇看下C#7又有哪些好东东


dennis2016
7 声望0 粉丝

努力的做一名合格的全栈工程师