• 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 表达式作用于属性
        }
    }
    复制代码
  • 相关阅读:
    转载:混淆包含SlidingMenu、gson等Android代码的proguard写法
    今天解决的两个问题
    C++中指针和引用的区别
    负载均衡服务器session共享的解决方案 (转载)
    Entity Framework的默认值BUG解决方法
    【转】SAPI中的IspeechRecoContext(接口)
    Sapi 添加语法的文章(转载)
    SAPI训练文件存储位置
    Flask第九篇 Flask 中的蓝图(BluePrint)
    Flask 第八篇 实例化Flask的参数 及 对app的配置
  • 原文地址:https://www.cnblogs.com/ansen312/p/5913565.html
Copyright © 2020-2023  润新知