C#6.0新特性的尝试
由于项目升级到了.NetFramework 4.6.1,开发工具转向了vs2015,趁机尝试下C#6.0.结果在网上搜的一些教程总结的不是太完整,有的代码随着vs正式版的发布也有所修改.那些个教程也没更新.
所以把自己学习到的记录一下.
1.自动属性初始化(Auto-property initializers)
public class Account
{ public string Name { get; set; } = "summit"; public int Age { get; set; } = 22; public IList<int> AgeList
{
get;
set;
} = new List<int> { 10,20,30,40,50 }; }
对于只读属性也可以这样直接初始化(C#5.0不支持),也可以直接在构造函数里初始化
public class Customer
{
public string Name { get; }
public Customer(string first, string last)
{
Name = first + " " + last;
}
}
2.字符串嵌入值(String interpolation)
在之前版本的String.Format中有多少个参数就要写多少个占位符还必须按照顺序,否则就报错.参数一多,这样搞的话确实头疼.新版本中在字符串前用$来标识后边的字符可以使用{对象}来作为占位符.看个例子.
Console.WriteLine($"年龄:{account.Age} 生日:{account.BirthDay.ToString("yyyy-MM-dd")}");
Console.WriteLine($"年龄:{account.Age}");
Console.WriteLine($"{(account.Age<=22?"小鲜肉":"老鲜肉")}");
如果想输出{或}符号,写两个即可,如$"{{".
注意这个$符号,网上的N多教程都是没有这个东东的.是直接"\{ account.Age \}",这种方式在新版本里已经被抛弃了.
3.导入静态类(Using Static)
像之前使用Math这个静态类的时候要先导入System命名空间后才能使用它.现在可以直接导入这个静态,然后代码中直接使用其函数.
using static System.Math;//注意这里不是命名空间哦 Console.WriteLine($"之前的使用方式: {Math.Pow(4, 2)}");
Console.WriteLine($"导入后可直接使用方法: {Pow(4,2)}");
注意这里是using static ...
如果某个命名空间下有n个方法,用这种方式直接引入单个静态类而不用引用所有方法还是挺方便的.
4.空值运算符(Null-conditional operators)
之前写过无数个这样的判断代码
if (*** != null)
{
//不为null的操作
}
return null;
现在使用可以简化这样方式.
var age = account.AgeList?[0].ToString(); Console.WriteLine("{0}", (person.list?.Count ?? 0));
如果account.AgeList为空则整个表达式返回空,否则后边的表达式的值.
5.对象初始化器(Index Initializers)
这种方式可以给字典或其他对象通过索引赋值初始化.
IDictionary<int, string> dict = new Dictionary<int, string>() {
[1]="first",
[2]="second"
};
foreach(var dic in dict)
{
Console.WriteLine($"key: {dic.Key} value:{dic.Value}");
} output:
key: 1 value:first
key: 2 value:second
6.异常过滤器(Exception filters)
private static bool Log(Exception e)
{
Console.WriteLine("log");
return true;
}
static void TestExceptionFilter()
{
try
{
Int32.Parse("s");
}
catch (Exception e) when (Log(e))
{
Console.WriteLine("catch");
return;
}
} 当when()里面返回的值不为true,将持续抛出异常,不会执行catch里面的方法.
7.nameof表达式 (nameof expressions)
在对方法参数进行检查时经常这样写:
private static void Add(Account account)
{
if (account == null)
throw new ArgumentNullException("account");
} 如果某天参数的名字被修改了,下面的字符串很容易漏掉忘记修改.
使用nameof表达式后,编译的时候编译器将检查到有修改后自动导航与重构(-_-! 不知道翻译的对不对)
private static void Add(Account account)
{
if (account == null)
throw new ArgumentNullException(nameof(account));
}
8.在cath和finally语句块里使用await(Await in catch and finally blocks)
c#5.0里是不支持这么写. Resource res = null;
try
{
res = await Resource.OpenAsync(…); // You could do this.
…
}
catch(ResourceException e)
{
await Resource.LogAsync(res, e); // Now you can do this …
}
finally
{
if (res != null) await res.CloseAsync(); // … and this.
}
9.在属性里使用Lambda表达式(Expression bodies on property-like function members)
public string Name =>string.Format("姓名: {0}", "summit"); public void Print() => Console.WriteLine(Name);
10.在方法成员上使用Lambda表达式
static int LambdaFunc(int x, int y) => x*y; public void Print() => Console.WriteLine(First + " " + Last);
关于C#6.0新增加的语言特性目前为止也就这么多.没有什么新功能,更多的是语法糖的改进.开发更舒服更快速.
最后附上github上关于c#6.0的相关介绍链接:点我点我
C#6.0新特性的尝试的更多相关文章
- 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 新特性4: 返回引用
本文参考Roslyn项目中的Issue:#118. 1. C# 7.0 新特性1: 基于Tuple的“多”返回值方法 2. C# 7.0 新特性2: 本地方法 3. C# 7.0 新特性3: 模式匹配 ...
- c# 6.0新特性(二)
写在前面 上篇文章介绍了c#6.0的using static,Auto Property Initializers,Index Initializers新的特性,这篇文章将把剩下的几个学习一下. 原文 ...
- c# 6.0新特性(一)
写在前面 接近年底了,基本上没什么活了,就学点新东西,就想着了解下c# 6.0的新特性.在code project上看到了一篇不错的文章,就准备翻译一下,顺便照着学习学习.废话不多说,直奔主题. 原文 ...
- [翻译] C# 8.0 新特性
原文: Building C# 8.0 [译注:原文主标题如此,但内容大部分为新特性介绍,所以意译标题为 "C# 8.0 新特性"] C# 的下一个主要版本是 8.0.我们已经为它 ...
- [翻译] C# 8.0 新特性 Redis基本使用及百亿数据量中的使用技巧分享(附视频地址及观看指南) 【由浅至深】redis 实现发布订阅的几种方式 .NET Core开发者的福音之玩转Redis的又一傻瓜式神器推荐
[翻译] C# 8.0 新特性 2018-11-13 17:04 by Rwing, 1179 阅读, 24 评论, 收藏, 编辑 原文: Building C# 8.0[译注:原文主标题如此,但内容 ...
- android6.0、7.0、8.0新特性总结之开发应用时加以考虑的一些主要变更。
android6.0 参考一:简书Android 6.0 新特性详解 参考二:关于Android6.0以上系统的权限问题 参考三:值得你关注的Android6.0上的重要变化(一) 参考四:值得你关注 ...
- Java基础加强-(注解,动态代理,类加载器,servlet3.0新特性)
1. Annotation注解 1.1. Annotation概述 Annotation是JDK 5.0以后提供对元数据的支持,可以在编译.加载和运行时被读取,并执行相应的处理.所谓Annota ...
- vue3.0新特性以及进阶路线
Vue3.0新特性/改动 新手学习路线 ===> 起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要 ...
随机推荐
- java 22 - 3 多线程的概述以及其它所涉及的东西(看)
1:要想了解多线程,必须先了解线程,而要想了解线程,必须先了解进程,因为线程是依赖于进程而存在. 2:什么是进程? 通过任务管理器我们就看到了进程的存在. 而通过观察,就可以发现只有运行的程序才会出现 ...
- React Native 项目运行在 Web 浏览器上面
React Native 的出现,让前端工程师拥有了使用 JavaScript 编写原生 APP 的能力.相比之前的 Web app 来说,对于性能和用户体验提升了非常多. 但是 React Nati ...
- Centos6.2 下 vncserver 的安装
好久没用vnc了, 把今天装的过程记录一下, 这是一个从网上下载的标准Centos6.2 虚机镜像, 已经带了桌面. 默认的用户是root和tom, 口令都是tomtom. 因为ssh服务没起来, 简 ...
- css 九宫格
http://jsfiddle.net/webtiki/kQXkt/ http://jsfiddle.net/webtiki/MpXYr/3/embedded/ https://www.web-tin ...
- SQL2012删除作业失败的处理
修改msdb数据库中的过程sp_delete_job,如下: USE [msdb] GO /****** Object: StoredProcedure [dbo].[sp_delete_job] S ...
- [转]使用 google gson 转换Timestamp或Date类型为JSON字符串.
创建类型适配类: import java.lang.reflect.Type; import java.sql.Timestamp; import java.text.DateFormat; impo ...
- jboss eap 6.3 集群(cluster)配置
接上一篇继续,Domain模式解决了统一管理多台jboss的问题,今天我们来学习如何利用mod_cluster来实现负载均衡.容错. mod_cluster是jboss的一个开源集群模块(基于apac ...
- Linux文件结构及基本文件夹
虽然Linux系统有很多种类,但是对于文件系统分区这块,基本上各个版本的Linux系统都是一样的.Linux文件系统分区不像Windows那样将硬盘分为C.D.E.F盘这样,Linux的文件结构是单个 ...
- 让时间处理简单化 【第三方扩展类库org.apache.commons.lang.time】
JAVA的时间日期处理一直是一个比较复杂的问题,大多数程序员都不能很轻松的来处理这些问题.首先Java中关于时间的类,从 JDK 1.1 开始,Date的作用很有限,相应的功能已由Calendar与D ...
- sublime 函数跳转插件 — ctags 安装和使用
ctags 是 sublime 下一个函数跳转的插件,可以让你方便地从函数调用的位置跳到函数定义的位置.相对于其他插件,ctags 的安装稍微有点复杂,这里记录下备忘. 首先,假设已经安装 Packa ...