C#6.0中10大新特性的應用和總結(jié)
微軟于2015年7月21日發(fā)布了Visual Studio 2015, .NET 2015, .NET Framework 4.6, ASP.NET 4.6, Azure SDK 2.7 for .NET, C# 6.0, F# 4.0, TypeScript 1.5, Visual Studio Android 模擬器 等重量級開發(fā)產(chǎn)品。
由于項目升級到了.NetFramework 4.6.1,開發(fā)工具轉(zhuǎn)向了VS2015,趁機嘗試下C#6.0。結(jié)果網(wǎng)上的教程不進人意,許久都沒有更新,只好自己做一下總結(jié)。
1.自動屬性初始化(Auto-property initializers)
{
public string Name { get; set; } = "summit";
public int Age { get; set; } = 22;
public IList<int> AgeList
{
get;
set;
} = new List<int> { 10,20,30,40,50 };
}
對于只讀屬性也可以這樣直接初始化(C#5.0不支持),也可以直接在構(gòu)造函數(shù)里初始化
{
public string Name { get; }
public Customer(string first, string last)
{
Name = first + " " + last;
}
}
2.字符串嵌入值(String interpolation)
在之前版本的String.Format中有多少個參數(shù)就要寫多少個占位符還必須按照順序,否則就報錯.參數(shù)一多,這樣搞的話確實頭疼.新版本中在字符串前用$來標識后邊的字符可以使用{對象}來作為占位符.看個例子.
Console.WriteLine($"年齡:{account.Age}");
Console.WriteLine($"{(account.Age<=22?"小鮮肉":"老鮮肉")}");
如果想輸出{或}符號,寫兩個即可,如$"{{".
注意這個$符號,網(wǎng)上的N多教程都是沒有這個東東的.是直接"\{ account.Age \}",這種方式在新版本里已經(jīng)被拋棄了.
3.導入靜態(tài)類(Using Static)
像之前使用Math這個靜態(tài)類的時候要先導入System命名空間后才能使用它.現(xiàn)在可以直接導入這個靜態(tài),然后代碼中直接使用其函數(shù).
Console.WriteLine($"之前的使用方式: {Math.Pow(4, 2)}");
Console.WriteLine($"導入后可直接使用方法: {Pow(4,2)}");
注意這里是using static ...
如果某個命名空間下有n個方法,用這種方式直接引入單個靜態(tài)類而不用引用所有方法還是挺方便的.
4.空值運算符(Null-conditional operators)
之前寫過無數(shù)個這樣的判斷代碼
{
//不為null的操作
}
return null;
現(xiàn)在使用可以簡化這樣方式.
Console.WriteLine("{0}", (person.list?.Count ?? 0));
如果account.AgeList為空則整個表達式返回空,否則后邊的表達式的值.
5.對象初始化器(Index Initializers)
這種方式可以給字典或其他對象通過索引賦值初始化.
[1]="first",
[2]="second"
};
foreach(var dic in dict)
{
Console.WriteLine($"key: {dic.Key} value:{dic.Value}");
}
output:
key: 1 value:first
key: 2 value:second
6.異常過濾器(Exception filters)
{
Console.WriteLine("log");
return true;
}
static void TestExceptionFilter()
{
try
{
Int32.Parse("s");
}
catch (Exception e) when (Log(e))
{
Console.WriteLine("catch");
return;
}
}
當when()里面返回的值不為true,將持續(xù)拋出異常,不會執(zhí)行catch里面的方法.
7.nameof表達式 (nameof expressions)
在對方法參數(shù)進行檢查時經(jīng)常這樣寫:
{
if (account == null)
throw new ArgumentNullException("account");
}
如果某天參數(shù)的名字被修改了,下面的字符串很容易漏掉忘記修改.
使用nameof表達式后,編譯的時候編譯器將檢查到有修改后自動導航與重構(gòu)(-_-! 不知道翻譯的對不對)
{
if (account == null)
throw new ArgumentNullException(nameof(account));
}
8.在cath和finally語句塊里使用await(Await in catch and finally blocks)
c#5.0里是不支持這么寫.
try
{
res = await Resource.OpenAsync(…); // You could do this.
…
}
catch(ResourceException e)
{
await Resource.LogAsync(res, e); // Now you can do this …
}
finally
{
if (res != null) await res.CloseAsync(); // … and this.
}
9.在屬性里使用Lambda表達式(Expression bodies on property-like function members)
public void Print() => Console.WriteLine(Name);
10.在方法成員上使用Lambda表達式
public void Print() => Console.WriteLine(First + " " + Last);
關于C#6.0新增加的語言特性目前為止也就這么多.沒有什么新功能,更多的是語法糖的改進.開發(fā)更舒服更快速.
您可能感興趣的文章
- 01-10C#通過反射獲取當前工程中所有窗體并打開的方法
- 01-10C#實現(xiàn)Winform中打開網(wǎng)頁頁面的方法
- 01-10C#實現(xiàn)由四周向中心縮小的窗體退出特效
- 01-10Extjs4如何處理后臺json數(shù)據(jù)中日期和時間
- 01-10C#實現(xiàn)打開畫圖的同時載入圖片、最大化顯示畫圖窗體的方法
- 01-10C#中DataGridView常用操作實例小結(jié)
- 01-10C#編程獲取資源文件中圖片的方法
- 01-10WinForm實現(xiàn)窗體最大化并遮蓋任務欄的方法
- 01-10asp.net中XML如何做增刪改查操作
- 01-10String.Format大全(C# Java)


閱讀排行
本欄相關
- 01-10C#通過反射獲取當前工程中所有窗體并
- 01-10關于ASP網(wǎng)頁無法打開的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實現(xiàn)txt定位指定行完整實例
- 01-10WinForm實現(xiàn)仿視頻 器左下角滾動新
- 01-10C#停止線程的方法
- 01-10C#實現(xiàn)清空回收站的方法
- 01-10C#通過重寫Panel改變邊框顏色與寬度的
- 01-10C#實現(xiàn)讀取注冊表監(jiān)控當前操作系統(tǒng)已
隨機閱讀
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實例總結(jié)
- 08-05織夢dedecms什么時候用欄目交叉功能?
- 01-10SublimeText編譯C開發(fā)環(huán)境設置
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10delphi制作wav文件的方法
- 01-10使用C語言求解撲克牌的順子及n個骰子
- 04-02jquery與jsp,用jquery
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實現(xiàn)頁面的局部加載