C#6.0語法糖剖析(二)

FrankYou發表於2015-07-31

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"。

相關文章