你的位置:首页 > ASP.net教程

[ASP.net教程]背水一战 Windows 10


[源码下载]


背水一战 Windows 10 (1) - C# 6 新特性



作者:webabcd


介绍
背水一战 Windows 10 之 C# 6 新特性

  • 介绍 C# 6.0 的新特性



示例
1、C# 6 示例 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 示例 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 示例 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
[源码下载]