VS2015預覽版中的C#6.0 新功能(三)

來源:互聯網
上載者:User

標籤: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對建構函式有一下的限制:

  1. 不能顯示聲明無參的建構函式
  2. 有參建構函式必須為所有的屬性賦值

在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 新功能(三)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.