個人原創譯文,轉載請注明出處。有不對的地方歡迎指出與交流。
英文原文:Professional C# 6 and .NET Core 1.0 - What’s New in C# 6
C# 6 的新功能
新的C #編譯器可以編譯C # 6 。它不僅已完成代碼清理;編譯器管道的功能也可以在自定義程序中使用,並且被應用在Visual Studio的許多功能里。
新的編譯平台可以增強C #許多新特征.雖然沒有類似LINQ或異步特征關鍵字的影響力,但許多增強的功能確實提高了開發者生產力。C # 6的變化都有哪些?
靜態引用
靜態引用聲明允許沒有靜態方法類名的調用:
C# 5:
using System; // etc. Console.WriteLine("Hello,World!");
C# 6
using static System.Console; // etc. WriteLine("Hello,World");
using static關鍵字將會在第2章“Core C #”提到
表達式方法
使用表達式方法時,可以用只包含一個語句的lambda表達式語法:
C# 5
public boolIsSquare(Rectangle rect) { return rect.Height == rect.Width; }
C# 6
public boolIsSquare(Rectangle rect) => rect.Height == rect.Width;
表達式方法將在第3章“對象和類型”中討論
表達式屬性
類似表達式方法,
單行屬性只有一個getaccessor ,可以用lambda語法編寫:
In C# 5
public string FullName { get { return FirstName +"" + LastName; } }
In C# 6
public string FullName=> FirstName +"" + LastName;
表達式屬性將在第3章討論.
自動實現的屬性預設器
自動實現的屬性可以通過屬性預設器進行初始化:
In C# 5
public class Person { public Person() { Age = 24; } public int Age {get; set;} }
In C# 6
public class Person { public int Age {get; set;} = 42; }
自動初始化的屬性預設器將在第3章討論。
只讀自動屬性
實現只讀屬性,C # 5中要求完整的屬性語法。但在C # 6,您可以使用自動實現的屬性:
C# 5
private readonly int_bookId; public BookId { get { return _bookId; } }
C# 6
public BookId {get;}
只讀自動屬性將在第3章討論。
nameof 運算符
利用新的nameof 運算符,字段名稱、屬性、方法或類型均可被訪問。這樣,重命名也不會錯過名稱更改:
C# 5
public void Method(objecto) { if (o == null) throw newArgumentNullException("o");
C# 6
public void Method(objecto) { if (o == null) throw newArgumentNullException(nameof(o));
nameof 運算符將在第 8章 “Operators and Casts.”中討論。
空指針傳遞運算符
null 空指針傳遞運算符可以簡化空指針檢查:
C# 5
int? age = p == null ?null : p.Age;
C# 6
int? age = p?.Age;
新的語法在觸發事件中也有優勢:
在 C# 5
var handler = Event; if (handler != null) { handler(source, e); }
在 C# 6
handler?.Invoke(source,e);
空指針傳遞運算符將在第8章中討論。
字符串插值
字符串插值消除調用string.Format。占位參數可以包含在表達式中則不必在string里利用數字占位進行格式化:
在 C# 5
public override ToString() { return string.Format("{0}, {1}",Title, Publisher); }
在 C# 6
public override ToString()=> $"{Title} {Publisher}";
與C # 5語法相比,以上C # 6的示例簡化了很多,因為它不僅使用字符串插值,使用了表達式方法。
字符串插值也可以使用字符串格式,並在分配可格式化的字符串時有特殊的功能。
字符串插值將在第10章“字符串和正則表達式”討論
字典初始化程序
字典可以使用一個類似集合預設器的字典預設器進行初始化。
在 C# 5
var dict = newDictionary<int, string>(); dict.Add(3,"three"); dict.Add(7,"seven");
在C# 6
var dict = newDictionary<int, string>() { [3] ="three", [7] ="seven" };
字典預設器將在第11章提 “集合”中討論。
異常過濾器
異常篩選器允許在捕獲異常之前對其進行過濾。
在C# 5
try { //etc. } catch (MyException ex) { if (ex.ErrorCode != 405) throw; // etc. }
In C# 6
try { //etc. } catch (MyException ex)when (ex.ErrorCode == 405) { // etc. }
新語法的一大優點不僅在於它減少了代碼長度,同時堆棧跟蹤沒有改變可改變的,這在C # 5中可能發生變化。
異常過濾器在第14章“錯誤和異常”討論。
等待捕捉
可以在catch子句中使用關鍵字await。而在C # 5需要在外層的代碼塊中才能使用。
在 C# 5
bool hasError = false; string errorMessage =null; try {
//etc. } catch (MyException ex) { hasError = true; errorMessage = ex.Message; } if (hasError) { await newMessageDialog().ShowAsync(errorMessage); }
在 C# 6
try { //etc. } catch (MyException ex) { await newMessageDialog().ShowAsync(ex.Message); }
此功能不需要增強C #語法;它目前是可用的。這種增強需要微軟大量的投資來使它的工作,但與你使用這個平台沒有關系。從兩個版本的對比可以看出對於開發者來說,代碼會越來越少。
注 請注意新的C # 6語言功能都包含在上述提到的章節,但本書所有章節都會使用新的C #語法。
