背水一戰 Windows 10 (1) - C# 6.0 新特性
作者:webabcd
介紹
背水一戰 Windows 10 之 C# 6.0 新特性
- 介紹 C# 6.0 的新特性
示例
1、C# 6.0 示例 1: 自動屬性支持初始化, 字符串嵌入的新方式, 通過 Using Static 引用靜態類, nameof 表達式
CSharp6/Demo1.xaml.cs
/* * C# 6 示例 1 * 自動屬性支持初始化, 字符串嵌入的新方式, 通過 Using Static 引用靜態類, nameof 表達式 */ using System; using System.ComponentModel; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using static System.Math; // 通過 Using Static 引用靜態類 namespace Windows10.CSharp6 { public sealed partial class Demo1 : Page { // 自動屬性支持初始化了 public string MyName { get; set; } = "default value"; // 只讀自動屬性也可以初始化 public int MyAge { get; } = 17; public Demo1() { this.InitializeComponent(); this.Loaded += Demo1_Loaded; } private void Demo1_Loaded(object sender, RoutedEventArgs e) { sample1(); sample2(); sample3(); sample4(); } // 自動屬性支持初始化(Initializers for auto-properties) private void sample1() { lblMsg.Text = this.MyName; lblMsg.Text += Environment.NewLine; lblMsg.Text += this.MyAge.ToString(); lblMsg.Text += Environment.NewLine; } // 字符串嵌入(String Interpolation)的新方式 private void sample2() { // 之前的字符串嵌入方式 lblMsg.Text += string.Format("myName: {0}, myAge: {1}", this.MyName, this.MyAge); lblMsg.Text += Environment.NewLine; // 新的字符串嵌入方式 lblMsg.Text += $"myName: {this.MyName}, myAge: {this.MyAge}, {{this.MyName}}"; lblMsg.Text += Environment.NewLine; } // 通過 Using Static 引用靜態類 private void sample3() { // 之前通過 using static System.Math; 引用了靜態類 System.Math // 那么之后就可以直接使用 System.Math 的方法了,如下 lblMsg.Text += Abs(-100).ToString(); lblMsg.Text += Environment.NewLine; } // nameof 表達式 private void sample4() { DateTime dateTime = new DateTime(); // nameof 表達式 - 用於獲取變量的名稱,比如下面這個會輸出 "dateTime",這個有什么用呢?參見之后的 "Book" 類的說明 lblMsg.Text += nameof(dateTime); lblMsg.Text += Environment.NewLine; } // 演示 nameof 表達式的用途 public class Book : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; private string _title; public string Title { get { return _title; } set { _title = value; if (PropertyChanged != null) { // 這里以前只能這么寫 PropertyChanged(this, new PropertyChangedEventArgs("Title")); // 現在可以向下面這樣寫 PropertyChanged(this, new PropertyChangedEventArgs(nameof(Title))); // 有什么用呢? // 如果我要修改屬性 Title 的名字時,而又忘了修改對應的 PropertyChangedEventArgs 中的名字,則編譯會報錯,以便修改 // 當然修改屬性名字時最好用 Visual Studio 提供的“重命名”的方法 } } } } } }
2、C# 6.0 示例 2: 在 catch 和 finally 中支持 await, 異常過濾器
CSharp6/Demo2.xaml.cs
/* * C# 6 示例 2 * 在 catch 和 finally 中支持 await, 異常過濾器 */ using System; using System.Threading.Tasks; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace Windows10.CSharp6 { public sealed partial class Demo2 : Page { public Demo2() { this.InitializeComponent(); this.Loaded += Demo2_Loaded; } private void Demo2_Loaded(object sender, RoutedEventArgs e) { sample1(); sample2(); } // 在 catch 和 finally 中也支持 await 了 private async void sample1() { try { throw new Exception(""); } catch { await Task.Delay(1000); } finally { await Task.Delay(1000); } } // 異常過濾器 (Exception filters) private void sample2() { try { throw new Exception(new Random().Next(3).ToString()); } catch (Exception ex) when (ex.Message.Equals("0")) // 通過 when 表達式過濾異常 { lblMsg.Text += "0"; lblMsg.Text += Environment.NewLine; } catch (Exception ex) when (ex.Message.Equals("1")) // 通過 when 表達式過濾異常 { lblMsg.Text += "1"; lblMsg.Text += Environment.NewLine; } catch (Exception ex) when (CheckExceptionMessage(ex, "2")) // 通過 when 表達式過濾異常(表達式中的判斷條件也可以是一個方法調用) { lblMsg.Text += "2"; lblMsg.Text += Environment.NewLine; } } private bool CheckExceptionMessage(Exception ex, string value) { if (ex.Message.Equals(value)) return true; return false; } } }
3、C# 6.0 示例 3: 帶索引的對象初始化器, null 值判斷, lambda 表達式作用於屬性或方法
CSharp6/Demo3.xaml.cs
/* * C# 6 示例 3 * 帶索引的對象初始化器, null 值判斷, lambda 表達式作用於字段或方法 */ using System; using System.Collections.Generic; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; namespace Windows10.CSharp6 { public sealed partial class Demo3 : Page { public Demo3() { this.InitializeComponent(); this.Loaded += Demo3_Loaded; } private void Demo3_Loaded(object sender, RoutedEventArgs e) { sample1(); sample2(); sample3(); } // 帶索引的對象初始化器 private void sample1() { // Dictionary 也可以這樣初始化了 var dict = new Dictionary<int, string> { [7] = "seven", [9] = "nine", [13] = "thirteen" }; lblMsg.Text += dict[13].ToString(); lblMsg.Text += Environment.NewLine; } // null 值判斷 private void sample2() { List<int> list = null; int? count = list?.Count; // 因為 list 是 null,所以 list?.Count 是 null int? value3 = list?[3]; // 因為 list 是 null,所以 list?[3] 是 null list = new List<int> { 1, 2, 3 }; count = list?.Count; // 這句會異常的,因為 list 不是 null 且 list 沒有第 11 個元素 // int? value10 = list?[10]; lblMsg.Text += count.ToString(); lblMsg.Text += Environment.NewLine; // null 值判斷的最主要的應用是這樣的 // 之前的寫法 object obj1 = null; if (obj1 != null) { obj1.ToString(); } // 現在的寫法 object obj2 = null; obj2?.ToString(); } // lambda 表達式作用於字段或方法 private void sample3() { lblMsg.Text += this.ToString(); lblMsg.Text += Environment.NewLine; lblMsg.Text += this.FullName; lblMsg.Text += Environment.NewLine; } public string FirstName { get; set; } = "lei"; public string LastName { get; set; } = "wanglei"; public override string ToString() => $"{FirstName} {LastName}"; // lambda 表達式作用於方法 public string FullName => $"{FirstName} {LastName}"; // lambda 表達式作用於字段 } }
OK
[源碼下載]