C#6.0中10年夜新特征的運用和總結。本站提示廣大學習愛好者:(C#6.0中10年夜新特征的運用和總結)文章只能為提供參考,不一定能成為您想要的結果。以下是C#6.0中10年夜新特征的運用和總結正文
微軟於2015年7月21日宣布了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 模仿器 等分量級開辟產物。
因為項目進級到了.NetFramework 4.6.1,開辟對象轉向了VS2015,乘隙測驗考試下C#6.0。成果網上的教程不進人意,好久都沒有更新,只好本身做一下總結。
1.主動屬性初始化(Auto-property initializers)
public class Account
{
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不支撐),也能夠直接在結構函數裡初始化
public class Customer
{
public string Name { get; }
public Customer(string first, string last)
{
Name = first + " " + last;
}
}
2.字符串嵌入值(String interpolation)
在之前版本的String.Format中有若干個參數就要寫若干個占位符還必需依照次序,不然就報錯.參數一多,如許弄的話確切頭疼.新版本中在字符串前用$來標識後邊的字符可使用{對象}來作為占位符.看個例子.
Console.WriteLine($"年紀:{account.Age} 誕辰:{account.BirthDay.ToString("yyyy-MM-dd")}");
Console.WriteLine($"年紀:{account.Age}");
Console.WriteLine($"{(account.Age<=22?"小鮮肉":"老鮮肉")}");
假如想輸入{或}符號,寫兩個便可,如$"{{".
留意這個$符號,網上的N多教程都是沒有這個東東的.是直接"\{ account.Age \}",這類方法在新版本裡曾經被擯棄了.
3.導入靜態類(Using Static)
像之前應用Math這個靜態類的時刻要先導入System定名空間後能力應用它.如今可以直接導入這個靜態,然子女碼中直接應用其函數.
using static System.Math;//留意這裡不是定名空間哦
Console.WriteLine($"之前的應用方法: {Math.Pow(4, 2)}");
Console.WriteLine($"導入後可直接應用辦法: {Pow(4,2)}");
留意這裡是using static ...
假如某個定名空間下有n個辦法,用這類方法直接引入單個靜態類而不消援用一切辦法照樣挺便利的.
4.空值運算符(Null-conditional operators)
之前寫過有數個如許的斷定代碼
if (*** != null)
{
//不為null的操作
}
return null;
如今應用可以簡化如許方法.
var age = account.AgeList?[0].ToString();
Console.WriteLine("{0}", (person.list?.Count ?? 0));
假如account.AgeList為空則全部表達式前往空,不然後邊的表達式的值.
5.對象初始化器(Index Initializers)
這類方法可以給字典或其他對象經由過程索引賦值初始化.
IDictionary<int, string> dict = new Dictionary<int, string>() {
[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)
private static bool Log(Exception e)
{
Console.WriteLine("log");
return true;
}
static void TestExceptionFilter()
{
try
{
Int32.Parse("s");
}
catch (Exception e) when (Log(e))
{
Console.WriteLine("catch");
return;
}
}
當when()外面前往的值不為true,將連續拋出異常,不會履行catch外面的辦法.
7.nameof表達式 (nameof expressions)
在對辦法參數停止檢討時常常如許寫:
private static void Add(Account account)
{
if (account == null)
throw new ArgumentNullException("account");
}
假如某天參數的名字被修正了,上面的字符串很輕易漏失落忘卻修正.
應用nameof表達式後,編譯的時刻編譯器將檢討到有修正後主動導航與重構(-_-! 不曉得翻譯的對纰謬)
private static void Add(Account account)
{
if (account == null)
throw new ArgumentNullException(nameof(account));
}
8.在cath和finally語句塊裡應用await(Await in catch and finally blocks)
c#5.0裡是不支撐這麼寫.
Resource res = null;
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 string Name =>string.Format("姓名: {0}", "summit");
public void Print() => Console.WriteLine(Name);
10.在辦法成員上應用Lambda表達式
static int LambdaFunc(int x, int y) => x*y;
public void Print() => Console.WriteLine(First + " " + Last);
關於C#6.0新增長的說話特征今朝為止也就這麼多.沒有甚麼新功效,更多的是語法糖的改良.開辟更舒暢更疾速.