Static Using static using聲明允許直接調用靜態方法而不需要指定類名: C# 5 C# 6 Expression-Bodied Methods 使用expression-bodied methods,一個只有一句statement的函數可以使用lambda寫法。 C# 5 C# ...
Static Using
static using聲明允許直接調用靜態方法而不需要指定類名:
C# 5
static void StaticUsingDemoInCSharp5(string output) { Console.WriteLine(output); // Call the static method WriteLine with class name Console }
C# 6
using static System.Console; namespace NewFeatureTest { class Program { static void Main(string[] args) { StaticUsingDemoInCSharp6("Hello, C# 6"); } static void StaticUsingDemoInCSharp6(string output) { WriteLine(output); } } }
Expression-Bodied Methods
使用expression-bodied methods,一個只有一句statement的函數可以使用lambda寫法。
C# 5
private static bool IsIntegerEqual(int a, int b) { return a == b; }
C# 6
private static bool IsIntegerEqualWithExpressionBodied(int a, int b) => a == b;
Expression-Bodied Properties
和expression-bodied methods類似,只支持get訪問器且只有一句statement的屬性(Properties)也可以使用lambda寫法。
C# 5
private string firstName; public string FirstName { get { return firstName; } }
C# 6
private string lastName; public string LastName => lastName;
Auto-Implemented Property Initializers
Auto-implemented Property可以在一個屬性初始化器里初始化。
C# 5
public string Sex { get; set; } public Person() { Sex = "Male"; }
C# 6
public int Age { get; set; } = 42; // The age will be initialized to 42 when object constructed
Read-Only Auto Properties
在之前的C#版本中,只讀屬性要求完整的屬性語法。C#6提供了自動實現的版本:
C# 5
private readonly string homeTown; public string HomeTown { get { return homeTown; } }
C# 6
public string BirthDay { get; } public Person(string _firstName, string _lastName) { BirthDay = DateTime.Today.ToString(); }
nameof Operator
使用最新的nameof操作符,欄位(fields)、屬性(Properties)、方法和類型的名字都能被取到。有了它,媽媽在也不用擔心改名字的時候會漏掉啦。
C# 5
public bool IsAdult(int age) { if (age < 0) { throw new ArgumentException("age"); } return age >= 18; }
C# 6
public bool IsAdultWithNameOfOperator(int age) { if (age < 0) { throw new ArgumentException(nameof(age)); } return age >= 18; }
Null Propagation Operator
null propagation操作符能夠大大滴簡化空對象的檢查。
C# 5
public Person(int? _age) { Age = _age == null ? -1 : _age.Value; }
C# 6
public Person(DateTime? _birthDay) { birthDay = _birthDay?.ToString(); }
String Interpolation
在c#6中,字元串插值不需要再call string.Format方法啦。相較於之前在string中使用數字占位符如{0},C#6支持表達式占位符如{age}。
C# 5
public override string ToString() { return string.Format("{0} {1}”, firstName, lastName); }
C# 6
public override string ToString() => $"{firstName} {lastName}";
在這裡,我們使用了新的string interpolation和expression-bodied method讓整個代碼相較於之前簡潔很多(按代碼行數算錢的碼農悲催了)。
Dictionary Initializers
在C# 6中,我們可以像集合初始化器一樣使用字典(Dictionary)初始化器來初始化字典對象。
C# 5
var dictInCSharp5 = new Dictionary<int, string>() { {2, "Two"}, {1, "One"} };
C# 6
var dictInCSharp6 = new Dictionary<int, string>() { [2] = "Two", [1] = "One" };
這東西個人覺得沒什麼用,反而容易和Collection的下標混淆。
Exceptions Filters
異常過濾器允許我們在catch異常之前使用條件來過濾異常。
C# 5
try { StaticUsingDemoInCSharp6(p.LastName); } catch (Exception e) { if (e.Message.Contains("Aha")) { throw; } }
C# 6
try { StaticUsingDemoInCSharp6(p.LastName); } catch(Exception e) when (e.Message.Contains("Aha")) { throw; }
Await in Catch
C#6允許我們在catch程式塊裡面使用await關鍵字。在c#5我們只能workaround。
C# 5
private static async Task AwaitInCatchDemoInCSharp5() { bool hasError = false; string errorMessage = string.Empty; try { throw new FieldAccessException("No Permission."); } catch(FieldAccessException e) { hasError = true; errorMessage = e.Message; } if(hasError) { await MessageDialog().ShowAsync(errorMessage); } }
C# 6
private static async Task AwaitInCatchDemoInCSharp5() { try { throw new FieldAccessException("No Permission."); } catch(FieldAccessException e) { await MessageDialog().ShowAsync(e.Message); } }
參考: 《Professional C#6 and .NET Core 1.0》