Visual Studio 2015速遞(1)——C#6.0新特性怎麼用

來源:互聯網
上載者:User

標籤:

對於IDE的爭論這個話題,在開發部已經由來已久,甚至可以追溯到微軟.NET技術發布之前,當時的主打產品是ActiveX控制項,隨著Borland Delphi的快速崛起,RAD勢不可擋,迅速催生了很多經典的IDE,微軟旗下最有名氣的就是VC和VB了;此後.NET技術發布,Visual Studio邁進20XX時代,對於VS2002和VS2003我已經基本沒有太深的印象了,僅僅留在記憶裡的是這貨要高效率,必須得安裝一個叫Resharper的玩意,否則也就比記事本強那麼一點點;隨後微軟發布了VS2005和VS2008,增加了MSBUILD引擎,最佳化智能提示,改進擴充模型,基本上算是成熟穩健了;之後在WPF技術上建立的VS2010一直給人臃腫華麗的印象,但是缺乏讓人眼前一亮的重磅功能;最近的兩次升級和發布是VS2012和VS2013,其中擺在頭條的幾個重大點不是效能就是Web和雲。

話說微軟前些日子高調的宣布Visual Studio 2015正式發布日期是7月20日,這在開發部迅速展開討論,大抵分成三派:

  • 技術流——我去,這IDE來來去去不就是那麼些功能麼,各種超級“記事本”就能搞定的事情,何必掙破頭去升級,只要技術沒有換代,貌似案頭還是WinForm為主,WPF半死不活;Web算是大變樣,不過那是運行環境而已;另外編譯還是msbuild,看起來整個意義不大。
  • 追新流——哈哈,微軟又出新版本啦,快下載來試試吧,這次肯定有不少殺手級功能,比如C#6.0,還有新的Roslyn編譯平台;另外asp.net 5.0可是很有看頭的,終於摘掉system.web的依賴,全線改用OWIN啦。
  • 冷靜流——讓他們這批小白鼠先淌著吧,確實爽在說,反正現在的任務有不是必須要這個。

最終還是追新流聲音比較大,因為大家都對C#的新版本很期待,雖然微軟C#語言群組的PM Mads Torgersen說過,“C# 6.0主要是增強和提升效率”,但是對於控制項開發小組而言依然相當期待,因為代碼的可讀性和效率是我們非常關鍵的部分。

這裡讓我們一起再來簡單回顧一下C#6.0的重要特性吧:

  1. NameOf運算式。曾幾何時,我們一直在hardcode各種參數異常,譬如:
    void ThrowArgumentNullException(string firstVersionArgumentName)
    {
      threw new ArgumentNullException(“firstVersionArgumentName”, “can not be null”);
    }
    很悲催的是第二版說不定PM就說:“這個參數名字不合適,咱改改吧”,得益於IDE的重構功能,這個很容易,直接F2改名然後斷行符號,簽入代碼;若干天后,測試找上門來,說你的參數名字是變了,但是異常資訊沒變。好吧,原來這裡的hardcode字元組,這個是不會隨著重構功能改變的!
    再來看看新的Nameof運算式給我帶來什麼,同樣的功能,代碼如下:
    void ThrowArgumentNullException(string firstVersionArgumentName)
    {
      threw new ArgumentNullException(nameof(firstVersionArgumentName), “can not be null”);
    }
    在回到IDE中,再次按F2觸發重構改名,你會發現異常資訊也能一起改變了。
  2. 空值判斷操作符(Null-conditional operators),又一個重量級代碼提升,直接上範例程式碼:
    public static string Tuncate(this string value, int length)
    {
      if(!string.IsNullOrEmpty(value))
      {
        return value.Substring(0, Math.Min(value.Length, length));
      }
      return value;
    }
    這隻是一個很小的折影,在開發過程中我們有無數這樣的方法,無數次重複為空白判斷,但是這對代碼的可讀性和業務處理沒有任何提升,反而增加了代碼複雜度,讓我們更難理解當初的設計初衷。顯然,C#6.0使用null-conditional operators來向前推進了一大步:
    public static string Tuncate(this string value, int length)
    {
      return value?.Substring(0, Math.Min(value.Length, length));
    }
    是不是更加簡潔明了,而且能突出業務核心邏輯!
  3. 字串嵌入值(string interpolation),終於可以擺脫長長的string.Format函數了,如下代碼就可以輕鬆改寫了:
    var fullName = string.Format(“FirstName is {0}, LastName is {1}”, customer.FirstName, customer.LastName);
    使用新特性之後代碼:
    var fullName = “FirstName is \{customer.FirstName}, LastName is \{customer.LastName}”;
  4. Lambda運算式函數和僅get的屬性。對於那些只有一兩句話的函數,可以省掉一些廢話了,這個新功能可以大大節省人力:
    public override string ToString() => “\{FirstName} \{LastName}”;
    public override int GetHashcode() => (FirstName.GetHashcode()^8) & (LastName.GetHashcode());
    public DateTime TimeStamp { get; } => DateTime.UtcNow;
  5. 自動屬性(auto-property)和索引初始化(Index initializers),終於可以像變數一樣給屬性賦初值了,大大提升代碼可讀性。
    public string FirstName { get; set; } = “John”;
    public string LastName { get; set; } = “Lennon”;
    private Dictionary<int, string> _dicts = new Dictionary<int, string> { [3] = “third”, [8] = “eight” };
    public string FullName { get; }
    pubic MyClass () 
    {
      FullName = “\{FirstName} \{LastName}”;
    }
  6. 異常過濾器(Exception filter),回想曾經的錯誤處理,為了提示不同的錯誤,我們不得不定義多個自訂異常,有了異常過濾器之後,我們可以通過給異常添加一個簡單的額外屬性就可以解決了:
    try { … }
    catach ( CustomException ex ) if ( CheckException(ex) )
    { … } 
    想想這個還有一個好處,比如嚴重異常日誌,在這個過濾器裡我們可以最簡單的判斷,發現若果是嚴重的問題,可以直接做更早的提醒。
  7. 引用靜態類(using static),懶人必備,想想某大仙在前面定義了一個超級無敵的靜態類和輔助方法,你有超級多的地方需要用,然後你就得一遍一遍的敲這個靜態類名和方法名,萬一這個靜態類名字很長就更悲催了,拷貝吧,最後總是看著大段大段重複心裡很不爽(程式員大部分都有代碼潔癖),好吧,這個應用靜態類就能很好的解決了:
    using GrapeCity.Demo.LongLongNameStaticClass;
    void AnotherMethod()
    {
      UtilA(…) // no LongLongNameStaticClass.UtilA(…)
    }
  8. Await增強,終於可以把await放到catch和finally塊中了,典型的用例是像IO資源操作之類可以簡單整潔的處理關閉了:
    Resource res = null;
    try
    {
      res = await Resource.OpenAsync(…); //一直都可以而且一直這麼做的
      ...
    }
    catch(ResourceException ex)
    {
      await Resource.LogAsync(res, ex); //寫日誌吧,不阻塞
    }
    finally
    {
      res?.CloseAsync(); //結合空值判斷操作符更簡潔明了
    }

C#6.0 特性就到這裡了,第二篇我們會介紹VS2015代碼編輯和調試相關的內容,看VS 2015是如何提升效率和品質的。請持續關注吧!

Visual Studio 2015速遞(1)——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.