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 表达式作用于属性
}
}
C# 6.0 新特性的更多相关文章
- 浅谈Tuple之C#4.0新特性那些事儿你还记得多少?
来源:微信公众号CodeL 今天给大家分享的内容基于前几天收到的一条留言信息,留言内容是这样的: 看了这位网友的留言相信有不少刚接触开发的童鞋们也会有同样的困惑,除了用新建类作为桥梁之外还有什么好的办 ...
- Java基础和JDK5.0新特性
Java基础 JDK5.0新特性 PS: JDK:Java Development KitsJRE: Java Runtime EvironmentJRE = JVM + ClassLibary JV ...
- Visual Studio 2015速递(1)——C#6.0新特性怎么用
系列文章 Visual Studio 2015速递(1)——C#6.0新特性怎么用 Visual Studio 2015速递(2)——提升效率和质量(VS2015核心竞争力) Visual Studi ...
- atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性
atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性 1.1. Servlet和JSP规范版本对应关系:1 1.2. Servlet2 ...
- 背水一战 Windows 10 (1) - C# 6.0 新特性
[源码下载] 背水一战 Windows 10 (1) - C# 6.0 新特性 作者:webabcd 介绍背水一战 Windows 10 之 C# 6.0 新特性 介绍 C# 6.0 的新特性 示例1 ...
- C# 7.0 新特性2: 本地方法
本文参考Roslyn项目中的Issue:#259. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...
- C# 7.0 新特性1: 基于Tuple的“多”返回值方法
本文基于Roslyn项目中的Issue:#347 展开讨论. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: ...
- C# 7.0 新特性3: 模式匹配
本文参考Roslyn项目Issue:#206,及Docs:#patterns. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# ...
- C# 7.0 新特性4: 返回引用
本文参考Roslyn项目中的Issue:#118. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...
- C#发展历程以及C#6.0新特性
一.C#发展历程 下图是自己整理列出了C#每次重要更新的时间及增加的新特性,对于了解C#这些年的发展历程,对C#的认识更加全面,是有帮助的. 二.C#6.0新特性 1.字符串插值 (String In ...
随机推荐
- 三种POST和GET的提交方式
向服务器提交数据有两种方式,post和get.两者的区别主要有三点,安全性.长度限制.数据结构.其中get请求安全性相比较而言较差,数据长度受浏览器地址栏限制,没有方法体.两种都是较为重要的数据提交方 ...
- Play Framework 完整实现一个APP(十二)
1.定制CRUD管理页面 > play crud:ov --layout 替换生成文件内容 app/views/CRUD/layout.html #{extends 'admin.html' / ...
- AngularJs中,如何在render完成之后,执行Js脚本
AngularJs是Google开源的前端JS框架.使用AngularJs, 我们能够容易地.健壮的开发出类似于Gmail一样的单页Web应用.AngularJs这个新兴的MVC前端框架,具有以下特点 ...
- 阿里云centos安装svn和submin
概述 没有找到可以让团队方便使用的云盘,暂时搭建一个svn凑合用一下 svn有三种安装方式 安装方式 服务程序 服务协议 用户和密码 授权 系统配置 svn独立安装 svnserve svn pass ...
- 0027 Java学习笔记-面向对象-(非静态、静态、局部、匿名)内部类
内部类 内部类就是把一个类写在另一个类的内部 用途: 如果一个类只希望它被某一个类访问,那么可以把它定义在另一个类的内部,并用private修饰 内部类可以访问它所在外部类的private成员:但所在 ...
- [Java入门笔记] Java语言基础(三):运算符
简介 运算符是一种特殊的符号,运算符是通过一定的运算规则操作一个或多个操作数,并生成结果的特定符号,运算符和操作数的有效组合称为表达式. Java中运算符主要分为以下几类: 赋值运算符 算术运算符 关 ...
- 【转】去除eclipse的JS验证
第一步:去除eclipse的JS验证:将windows->preference->Java Script->Validator->Errors/Warnings->Ena ...
- DMZ区
DMZ是英文“Demilitarized Zone”的缩写,它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间的缓冲区,这个缓冲区位于企业内部网络和外部 ...
- 有关stm32的问题,程序里面的u8、u16这些是什么意思啊
u8 是 unsigned charu16 是 unsigned shortu32 是 unsigned int
- 利用oneproxy部署mysql数据库的读写分离
实验系统:CentOS 6.6_x86_64 实验前提:防火墙和selinux都关闭 实验说明:本实验共有4台主机,IP分配如拓扑 实验软件:mariadb-10.0.20 oneproxy-rhel ...