標籤:visual studio 2015 c#6.0
對於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的重要特性吧:
- 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觸發重構改名,你會發現異常資訊也能一起改變了。
- 空值判斷操作符(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));
}
是不是更加簡潔明了,而且能突出業務核心邏輯!
- 字串嵌入值(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}”;
- Lambda運算式函數和僅get的屬性。對於那些只有一兩句話的函數,可以省掉一些廢話了,這個新功能可以大大節省人力:
public override string ToString() => “\{FirstName} \{LastName}”;
public override int GetHashcode() => (FirstName.GetHashcode()^8) & (LastName.GetHashcode());
public DateTime TimeStamp { get; } => DateTime.UtcNow;
- 自動屬性(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}”;
}
- 異常過濾器(Exception filter),回想曾經的錯誤處理,為了提示不同的錯誤,我們不得不定義多個自訂異常,有了異常過濾器之後,我們可以通過給異常添加一個簡單的額外屬性就可以解決了:
try { … }
catach ( CustomException ex ) if ( CheckException(ex) )
{ … }
想想這個還有一個好處,比如嚴重異常日誌,在這個過濾器裡我們可以最簡單的判斷,發現若果是嚴重的問題,可以直接做更早的提醒。
- 引用靜態類(using static),懶人必備,想想某大仙在前面定義了一個超級無敵的靜態類和輔助方法,你有超級多的地方需要用,然後你就得一遍一遍的敲這個靜態類名和方法名,萬一這個靜態類名字很長就更悲催了,拷貝吧,最後總是看著大段大段重複心裡很不爽(程式員大部分都有代碼潔癖),好吧,這個應用靜態類就能很好的解決了:
using GrapeCity.Demo.LongLongNameStaticClass;
void AnotherMethod()
{
UtilA(…) // no LongLongNameStaticClass.UtilA(…)
}
- 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新特性怎麼用