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 表达式作用于属性
    }
}

时间: 2024-11-07 01:32:43

C# 6.0 新特性的相关文章

Day07 jdk5.0新特性&Junit&反射

day07总结 今日内容 MyEclipse安装与使用 JUnit使用 泛型 1.5新特性 自动装箱拆箱 增强for 静态导入 可变参数方法 枚举 反射 MyEclipse安装与使用(yes) 安装MyEclipse 先安装了JDK ? MyEclipse介绍 ? MyEclipse是Eclipse的一个插件: MyEclipse是需要花钱的: MyEclipse官网不在欢迎中国人登录: ? MyEclipse使用 ? 1 创建项目 选择工作空间: 工作空间路径不能有空格和中文: 工作空间以班名

Atitit.&#160;C#.net&#160;clr&#160;2.0&#160;&#160;4.0新特性

Atitit. C#.net clr 2.0  4.0新特性 1. CLR内部结构1 2. CLR 版本发展史3 3. CLR 2.0 3 4. CLR 4 新特性 概览4 4.1.1.  托管与本地代码的互操作5 4.1.2.    垃圾回收6 4.1.3.    代码约定6 4.1.4.    Corrupted state exception6 4.1.5.     新的安全模型7 4.1.6.     同一个进程,多个CLR7 4.1.7.     基本类库7 5. CLR最新发展8 6

day07 MyEclipse 安装 jdk5.0 新特性

1.myeclipse的安装和使用 * eclipse:是一个免费的开发工具    * myeclipse:是一个收费的插件,破解myeclipse,        ** 安装目录的要求: 不能有中文和空格        ** 安装完成之后,选择一个工作空间 ,这个工作空间不能有中文和空格    * 破解myeclipse        ** 运行run.bat文件,但是运行之前,必须要安装jdk,通过配置环境变量 * myeclipse的使用        * 创建一个工程          

AFNetworking 2.0 新特性讲解之AFHTTPSessionManager

AFNetworking 2.0 新特性讲解之AFHTTPSessionManager (2014-02-17 11:56:24) 转载▼     AFNetworking 2.0 相比1.0 API 接口改动还是很大的. 其中一个便是 AFURLSessionManager,当然如果你不太熟悉,或者为了兼容低版本,你依然可以选择AFHTTPRequestOperationManager,AFURLSessionManager是基于 NSURLSessionConfiguration(IOS 7

Servlet 3.0 新特性详解

转自:https://www.ibm.com/developerworks/cn/java/j-lo-servlet30/ Servlet 3.0 新特性详解 张 建平2010 年 4 月 23 日发布 WeiboGoogle+用电子邮件发送本页面 6 Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署.其

android 7.0 新特性 和对开发者的影响

android 7.0新特性 - jiabailong的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/jiabailong/article/details/52411300 android 7.0对开发者会有哪些影响 - jiabailong的专栏 - 博客频道 - CSDN.NEThttp://blog.csdn.net/jiabailong/article/details/52411353 android 7.0 多窗口及新特性demo - jiabail

C#6.0新特性

C#6.0新特性怎么用 系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 前文提到过一个神器叫Resharper,功能强大,编码效率和代码质量那是蹭蹭的涨,但是神器的最大问题是太耗费资源了,每次系统提示内存不足的时候,那叫一个纠结啊.因此每次新的VS发布的时候都情不自禁的查看是否增强编辑功能,情不自禁的讨论一番,这次VS2015也不例外. 去年微软放出Roslyn的时候,微软就曾经放出过一个“尝鲜”版的VS编辑增强功能,恰恰就是重构(reflector),话说这

ASP.NET MVC—1、前期知识储备(C#3.0新特性)

在学习ASP.NET MVC之前,有必要先了解一下C#3.0所带来的新的语法特性,这一点尤为重要,因为在MVC项目中我们利用C#3.0的新特性将会大大的提高我们的开发效率,同时,在MVC项目中你将到处可以看到C#3.0新特性的身影. C#3.0新特性 自动属性 隐式类型 var 对象初始化器与集合初始化器 匿名类 扩展方法 Lambda表达式 自动属性 这个概念很简单,其简化了我们在.NET的时候手写一堆私有成员+属性的编程方式,我们只需要使用如下方式声明一个属性,编译器会自动生成所需的成员变量

Spark1.0.0新特性

Spark1.0.0 release于2014-05-30日正式公布,标志Spark正式进入1.X的时代.Spark1.0.0带来了各种新的特性,并提供了更好的API支持:Spark1.0.0添加了Spark SQL这一个新的重要组件,用于载入和操作Spark的结构化数据:Spark1.0.0增强了现有的标准库(ML,streaming,GraphX),同一时候还增强了Java和Python语言的支持:最后,Spark1.0.0在运维上做了非常大的改进,包含支持Hadoop/YARN安全机制.使

Hadoop 2.4.0新特性介绍

在2014年4月7日,Apache发布了Hadoop 2.4.0 .相比于hadoop 2.3.0,这个版本有了一定的改进,突出的变化可以总结为下列几点(官方文档说明): 1 支持HDFS访问控制列表(ACL,Access Control Lists) 这个特性解决了在一定情况下,文件权限访问的权限问题.其机制是基于Linux文件访问权限的特征,如果你熟悉Linux的文件访问机制,你就不用再去理解HDFS文件访问的特性了. 有了ACL特性后,对HDFS文件系统就具有了良性的扩展特性.HDFS-4