歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Visual Studio 2015系列教程(1)——C#6.0新特性怎麼用

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

日期:2017/2/28 13:59:58   编辑:Linux教程

對於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

Visual Studio 的詳細介紹:請點這裡
Visual Studio 的下載地址:請點這裡

Copyright © Linux教程網 All Rights Reserved