zoukankan      html  css  js  c++  java
  • 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 表达式作用于属性
        }
    }
    复制代码
  • 相关阅读:
    hdoj 2803 The MAX【简单规律题】
    hdoj 2579 Dating with girls(2)【三重数组标记去重】
    hdoj 1495 非常可乐【bfs隐式图】
    poj 1149 PIGS【最大流经典建图】
    poj 3281 Dining【拆点网络流】
    hdoj 3572 Task Schedule【建立超级源点超级汇点】
    hdoj 1532 Drainage Ditches【最大流模板题】
    poj 1459 Power Network【建立超级源点,超级汇点】
    hdoj 3861 The King’s Problem【强连通缩点建图&&最小路径覆盖】
    hdoj 1012 u Calculate e
  • 原文地址:https://www.cnblogs.com/ansen312/p/5913565.html
Copyright © 2011-2022 走看看