C#6.0语法糖剖析(二)

1、索引初始化

使用代码

 var numbers2 = new Dictionary<int, string> {[7] = "seven", [9] = "nine", [13] = "thirteen"};

编译器生成的代码

 Dictionary<int, string> dictionary2 = new Dictionary<int, string>();
    dictionary2[7] = "seven";
    dictionary2[9] = "nine";
    dictionary2[13] = "thirteen";
    Dictionary<int, string> dictionary = dictionary2;

2、异常过滤器When

使用代码

try
{
    throw new ArgumentException("string error");
}
catch (Exception e) when(MyFilter(e))
{
    WriteLine(e.Message);
}

private static bool MyFilter(Exception e)
{
    return e is ArgumentException;
}

When语法作用是:在进入到catch之前、验证when括号里MyFilter方法返回的bool,如果返回true继续运行,false不走catch直接抛出异常。

使用这个filter可以更好的判断一个错误是继续处理还是重新抛出去。按照以前的做法,在catch块内如需再次抛出去,需要重新throw出去,这时的错误源是捕捉后在抛的,而不是原先的,有了when语法就可以直接定位到错误源。

3、catch和finally代码块内的await

Await异步处理是在c#5.0提出的,但不能在catch和finally代码块内使用,这次在C#6.0更新上支持了。

使用代码:

async void Solve()
{
    try
    {
        await HttpMethodAsync();
    }
    catch (ArgumentException e)
    {
        await HttpMethodAsync();
    }
    finally
    {
        await HttpMethodAsync();
    }
}

3、nameof表达式

使用代码:

string nameOfAuthor;
WriteLine(nameof(nameOfAuthor));

使用nameof来获取成员变量的名称,上面会输出:"nameOfAuthor"。

原文地址:https://www.cnblogs.com/frankyou/p/4692150.html