標籤:style blog http io ar color 使用 sp strong
Using static
使用using StaticClass,你可以訪問StaticClass類裡的static成員而不需要指定類的名字,來看下面的例子
using System.Console;namespace CSharp6_0{ class UsingStatic { public void PrintMsg(string message) { WriteLine(message); } }}
在本例中,通過在一開始聲明using System.Console; 在PrintMsg方法中就可以直接存取Console類的WriteLine方法了,而不需要使用Console.WriteLine。
這個文法糖的一個用處就是對於擴充方法,可以只引入一個擴充類中的擴充方法,而不是按命名空間引入整個命名空間的。
索引初始化器
對象和集合初始化器在初始化對象的屬性,域或者給集合一組初始元素時,非常方便有效,而對於字典和帶有索引器的對象,就不是那麼方便。在6.0中,為對象初始化器引入了新的文法來通過索引器根據key設定value,下面是一個例子
class IndexerIntializer { public void Show() { var dictionary = new Dictionary<int, string> { [0] = "first", [2] = "third", }; Console.WriteLine(dictionary[0]); Console.WriteLine(dictionary[1]);//willthrow exception since it is not set. Console.WriteLine(dictionary[2]); } }
例子中在建立字典對象時,使用索引初始化器為其第一個元素和第三個元素設定了值.
異常過濾器
F#和VB中都具有異常過濾器,在c#6.0中也加入了這個功能,這樣我們就能夠寫出如下所示的代碼
try { … }catch (MyException e) if (myfilter(e)){ …}
只有if中的myfilter返回true,才會執行對應的catch語句塊,否則異常會繼續拋出。異常過濾器在需要先catch,然後再throw出去的情況下,非常適用,因為它對異常的stack資訊沒有改變,在後面的處理中,能夠取到異常最初拋出的地方而非重新拋出的地方。來看下面的一個例子
internal class ExceptionFilter { private void ThrowException(string argument) { if (argument == null) { throw new ArgumentNullException("argument is null"); } } private bool LogExcetion(Exception ex) { Console.WriteLine("Logger: " +ex.Message); return false; } public void Show() { try { ThrowException(null); } catch (ArgumentNullException ex) if (LogExcetion(ex)) { Console.WriteLine("Only print this when the filter return true"); } } }
這個ExceptionFilter類有三個方法,其中ThrowException是異常拋出點,LogException是異常過濾函數,Show函數則調用ThrowException函數並使用LogException函數寫log。
下面是調用Show函數的執行結果
從中可以看出,Show函數的catch塊並沒有執行,因為LogException函數返回false。異常的stack資訊儲存完成。
在catch和finally裡使用await
在c#5.0中,await關鍵字是不能在catch和finally語句塊中使用的,在6.0中這個限制已經沒有了,如下所示你可以把它用在catch和finally語句塊中了
internal class AwaitInCatchAndFinally { public async void Show() { try { await OpenAsync(); // You could do this. } catch (Exception e) { await ProcessExceptionAsync(e); // Now you can do this … } finally { await CleanAsync(); //and this } } private Task ProcessExceptionAsync(Exception e) { return new TaskFactory().StartNew(() => Console.WriteLine("ProcessExceptionAsync: " + e.Message)); } private Task CleanAsync() { return new TaskFactory().StartNew(() => Console.WriteLine("CleanAsync is called ")); } private Task OpenAsync() { throw new Exception("exception happened."); } }
在本例中,await方法用在了catch和finally語句塊中,下面是該程式的執行結果
結構體中的無參建構函式
之前struct對建構函式有一下的限制:
- 不能顯示聲明無參的建構函式
- 有參建構函式必須為所有的屬性賦值
在c#6.0中,可以在struct中聲明一個無參建構函式,下面是一個例子
internal struct StructParameterlessCtor { public int CPUCount { get; set; } public string Band { get; set; } public StructParameterlessCtor(int countOfCPU, string band) { CPUCount = countOfCPU; Band = band; } public StructParameterlessCtor() { CPUCount = 1; Band = "DELL"; } }
這個struct中,有兩個建構函式,一個是有參的,一個是無參的,無論是有參還是無參的都必須為所有的屬性賦值。這裡無參建構函式也可以像下面那樣調用有參的建構函式:
public StructParameterlessCtor() : this(1, "DELL") { }
struct中的無參建構函式只有在顯示使用new運算子時才會被調用, default(StructParameterlessCtor) 和 new StructParameterlessCtor[...] 都不會調用無參建構函式。
VS2015預覽版中的C#6.0 新功能(三)