首頁 > 軟體

Visual Studio 2015系列教學(1)——C#6.0新特性怎麼用

2020-06-16 17:57:14

對於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 Code 簡單試用體驗  http://www.linuxidc.com/Linux/2015-05/116887.htm

Visual Studio 2010 & Help Library Manager 安裝說明 http://www.linuxidc.com/Linux/2012-11/74814.htm

OpenCV 2.3.x/2.4.x在Visual Studio 2005/2008和Visual Studio 2010設定方法詳解 http://www.linuxidc.com/Linux/2012-08/68302.htm

使用OpenCV-2.4.0.exe檔案編譯x86或x64平台Visual Studio 2005/2008/2010目標檔案 http://www.linuxidc.com/Linux/2012-08/68305.htm

Visual Studio LightSwitch增加對HTML5和JavaScript的支援 http://www.linuxidc.com/Linux/2012-06/63397.htm

Visual Studio 11:使用 C++ 開發一個最簡單的 Metro 應用 http://www.linuxidc.com/Linux/2012-06/62657.htm


IT145.com E-mail:sddin#qq.com