VS2015 C#6.0 中的那些新特性(转载)
自动属性初始化 (Initializers for auto-properties)
以前我们是这么写的

为一个默认值加一个后台字段是不是很不爽,现在我们可以这样写

只读属性的初始化(Getter-only auto-properties)
像用户ID这种只读属性,我们以前是这样写的

现在我们可以这样写

只读属性可以和标了readonly的字段一样在构造函数里面赋值。
用Lambda作为函数体 (Expression bodies on method-like members)

平时总是有一些短小精悍的代码,但我们不得不把他们放到两个括号中,现在我们可以这么写

Lambda表达式用作属性 (Expression bodies on property-like function members)

这种用法同样可以用于属性

字符串嵌入值 (String interpolation)
这个叫法有点怪,看个例子就明白了,上面那个string.Format其实可以这样写,不仅写起来方便,而且可读性也非常好。

如果要用到格式控制,和以前一样加上就可以了。
Using静态类 (Using static)
如果一个静态类里面是一堆方法,比如Math 可以不用写类名,直接调用他的静态方法

有人说这有破坏面向对象的嫌疑,我倒觉得这让C#在函数式编程上更进一步,至于到底是怎样,time will tell.
值得一提的是,这种using 也会引入扩展方法,之前using System.Linq 会把这个命名空间下所有的扩展方法引入,如果只需要一部分 (比如Enumerable),这种用法会很方便。
空值判断 (Null-conditional operators)

这种写法相信有非常多的朋友用过,经常为了一个是否为空的问题搞得代码非常难看,比如视频里的那个

再举个例子,我们要获取一个列表的长度

这种写法真是太恶心了,在C#6.0中,我们可以这样写

从这里也可以看出这种操作符的一个规则:如果对象为空,则整个表达式的值为空。
后面的成员访问不限于方法,还可以是属性,索引器等。
给个实际应用的例子,在触发事件时,经常见到这样的写法,一个委托在调用前总是要判断是否为空

现在我们可以这样

如果PropertyChanged为null,那这句就什么也不做。
nameof表达式 (nameof expressions)
在方法参数检查时,经常会见到这样的代码

里面有那个role是我们手写的字符串,在给role改名时,很容易把下面的那个字符串忘掉,C#6.0解决了这个问题,看看新写法

带索引的对象初始化器 (Index initializers)
对象初始化器在C#3.0就已经有了,C#6.0的对象初始化器加入了对索引器的支持,使得字典一类的东西也可以轻松初始化
这是一个Json.NET使用的例子

异常筛选器 (Exception filters)
这个在VB和F#中早就有的功能也加进来了,看看用法

在微软的文档中还给出了另一种用法,这个异常会在日志记录失败时抛给上一层调用者

catch和finally 中的 await (Await in catch and finally blocks)
这是另一个和异常相关的特性,使得我们可以在catch 和finally中等待异步方法,看微软的示例

无参数的结构体构造函数 (Parameterless constructors in structs)
在之前版本的C#中是不允许结构体拥有无参构造函数的,在C#6.0中是允许的,但需要注意一点,通过new得到的结构体会被调用构造函数,而通过default得到的不会调用
看看这个例子

首先是一个结构体,通过两种不同的方式创建,然后输出

不见的功能
Primary constructor和 out参数定义变量那个不见了,有说法是cut掉了,微软真是纠结。。
详情: Changes to the language feature set
总体感觉C#6.0加入的更多是语法糖,语言本身没有太多新的概念,语法糖的加入会让C#程序员写出的代码更优美,更有生产力,希望C#越做越好!
版权声明:本文的版权归作者与博客园共同所有。转载时请在明显地方注明本文的详细链接,未经作者同意请不要删除此段声明,感谢您为保护知识产权做出的贡献。
VS2015在自己机器上确实是装好了,费了老劲了,想来体验一下跨平台的快感,结果被微软狠狠的来了一棒子了,装好了还是没什么用,应该还需要装Xarmain插件,配置一些参数吧,由于这块之前从未接触过,想了想还是先不把时间继续浪费在这里了,于是乎来体验一下新特性了。
本人个人博客原文链接地址为http://aehyok.com/Blog/Detail/66.html。
本文参考http://roslyn.codeplex.com,参考PDF文档http://files.cnblogs.com/aehyok/VS2015CSharp6.0.pdf
1、自动属性的增强
1.1、自动属性初始化 (Initializers for auto-properties)
C#4.0下的果断实现不了的。

C#6.0中自动属性的初始化方式

只要接触过C#的肯定都会喜欢这种方式。真是简洁方便呀。
1.2、只读属性初始化Getter-only auto-properties
先来看一下我们之前使用的方式吧
public class Customer
{
public string Name { get; } public Customer(string firstName,string lastName)
{
Name = firstName +" "+ lastName;
}
}
再来看一下C#6.0中
public class Customer
{
public string FirstName { get; }="aehyok";
public string LastName { get; }="Kris"; }
和第一条自动属性初始化使用方式一致。
2、Expression bodied function members
2.1 用Lambda作为函数体Expression bodies on method-like members
public Point Move(int dx, int dy) => new Point(x + dx, y + dy);
再来举一个简单的例子:一个没有返回值的函数
public void Print() => Console.WriteLine(FirstName + " " + LastName);
2.2、Lambda表达式用作属性Expression bodies on property-like function members
public override string ToString()
{ return FirstName + " " + LastName;
}
现在C#6中
public class User
{ public string FirstName { get; set; } public string LastName { get; set; } public override string ToString() => string.Format("{0}——{1}", FirstName, LastName); public string FullName => FirstName + " " + LastName;
}
3、引用静态类Using Static
在Using中可以指定一个静态类,然后可以在随后的代码中直接使用静态的成员

4、空值判断Null-conditional operators
直接来看代码和运行结果

通过结果可以发现返回的都为null,再也不像以前那样繁琐的判断null勒。
5、字符串嵌入值
在字符串中嵌入值
之前一直使用的方式是

现在我们可以简单的通过如下的方式进行拼接

6、nameof表达式nameof expressions
在方法参数检查时,你可能经常看到这样的代码(之前用的少,这次也算学到了)
public static void AddCustomer(Customer customer)
{ if (customer == null)
{ throw new ArgumentNullException("customer");
}
}
里面有那个customer是我们手写的字符串,在给customer改名时,很容易把下面的那个字符串忘掉,C#6.0 nameof帮我们解决了这个问题,看看新写法
public static void AddCustomer(Customer customer)
{ if (customer == null)
{ throw new ArgumentNullException(nameof(customer));
}
}
7、带索引的对象初始化器Index initializers
直接通过索引进行对象的初始化,原来真的可以实现

通过这种方式可以发现字典中只有三个元素,所以也就只有这三个索引可以访问额,其他类型的对象和集合也是可以通过这种方式进行初始化的,在此就不进行一一列举了。
8、异常过滤器 (Exception filters)
先来看一个移植过来的方法
try { var numbers = new Dictionary<int, string> {[7] = "seven",[9] = "nine",[13] = "thirteen" };
} catch (ArgumentNullException e)
{ if (e.ParamName == "customer")
{
Console.WriteLine("customer can not be null");
}
}
在微软的文档中还给出了另一种用法,这个异常会在日志记录失败时抛给上一层调用者
private static bool Log(Exception e)
{ ///处理一些日志 return false;
} static void Main(string[] args)
{ try { /// } catch (Exception e){if (!Log(e))
{ }
} Console.ReadLine();
}
9、catch和finally 中的 await —— Await in catch and finally blocks
在C#5.0中,await关键字是不能出现在catch和finnaly块中的。而在6.0中
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. }
10、无参数的结构体构造函数—— Parameterless constructors in structs

总结
之前看到有大神发过一篇文章http://www.cnblogs.com/henryzhu/p/new-feature-in-csharp-6.html,自己还是禁不住想来切身的体验一番。感觉很不错。 也学到了不少新东西。
VS2015 C#6.0 中的那些新特性(转载)的更多相关文章
- VS2015 C#6.0 中的那些新特性(转自http://www.cnblogs.com/henryzhu/p/new-feature-in-csharp-6.html)
自动属性初始化 (Initializers for auto-properties) 以前我们是这么写的 为一个默认值加一个后台字段是不是很不爽,现在我们可以这样写 只读属性的初始化(Getter-o ...
- VS2015 C#6.0 中的那些新特性
本人个人博客原文链接地址为http://aehyok.com/Blog/Detail/66.html. 个人网站地址:aehyok.com QQ 技术群号:206058845,验证码为:aehyok ...
- C#6.0 中的那些新特性
C#6.0 中的那些新特性 前言 VS2015在自己机器上确实是装好了,费了老劲了,想来体验一下跨平台的快感,结果被微软狠狠的来了一棒子了,装好了还是没什么用,应该还需要装Xarmain插件,配置一些 ...
- Jdk5.0中出现的新特性
掌握jdk5.0中出现的新特性1.泛型(Generics)2.增强的"for"循环(Enhanced For loop)3.自动装箱/自动拆箱(Autoboxing/unboxin ...
- C# 9.0中引入的新特性init和record的使用思考
写在前面 .NET 5.0已经发布,C# 9.0也为我们带来了许多新特性,其中最让我印象深刻的就是init和record type,很多文章已经把这两个新特性讨论的差不多了,本文不再详细讨论,而是通过 ...
- C#6.0中10大新特性的应用和总结
微软发布C#6.0.VS2015等系列产品也有一段时间了,但是网上的教程却不多,这里真对C#6.0给大家做了一些示例,分享给大家. 微软于2015年7月21日发布了Visual Studio 20 ...
- Android3.0中ActionBar的新特性
1. ActionBar(活动栏)替代了显示在屏幕顶端的标题栏.主要负责显示菜单,widget,导航等功能,主要包括:@ 显示选项菜单中的菜单项到活动栏:@ 添加可交互的视图到活动栏作为活动视图: ...
- VS2015 C#6.0 中的没有实现/支持的特性
VS2015 C#6.0 中的没有实现/支持的特性 .数组增强:赋值 维数组 Int[] numbers: numbers = {2,3,4,5}; 维数组 Int[,] numbers2; ...
- iOS中的项目新特性页面的处理
一般项目中都会出现新特性页面,比如第一次使用应用的时候,或者在应用设置里查看新特性的时候会出现. 这里,选择新建一个专门处理项目新特性的控制器,来完成功能. 首先是 NewFeaturesViewCo ...
随机推荐
- HDU 5506 - BestCoder Round #60 - GT and set
题目链接 : http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=641&pid=1003 题意 : 给N集 ...
- Java里的接口
Java里面由于不允许多重继承,所以如果要实现多个类的功能,则可以通过实现多个接口来实现. Java接口和Java抽象类代表的就是抽象类型,就是我们需要提出的抽象层的具体表现.OOP面向对象的编程,如 ...
- onActivityResult不执行 或者 onActivityResult的解决方法
开发人员都知道,可以通过使用 startActivityForResult() 和 onActivityResult() 方法来传递或接收参数.然而在一次使用中,还没等到被调用的 Activity 返 ...
- Java设计模式——Observer(观察者)模式
在多个对象之间建立一对多的关系,以便当一个对象状态改变的时候.其它全部依赖于这个对象的对象都能得到通知,并被自己主动更新. 适用情况: 当一个抽象模型有两个方面,当中一个方面依赖于还有一方面. 将这二 ...
- [Angular 2] Async Http
Async Pipe: The Asynce pipe receive a Promise or Observable as input and subscribes to the input, e ...
- [ES6] Objects vs Maps
Map is really useful when you want to use object as a key to set vaule, in ES5, you cannot really us ...
- Python3.2官方文档翻译--继承
6.5 继承 当然,一门语言特性假设不支持继承那么名称类就失去了价值.子类继承父类的方法例如以下: class DerivedClassName(BaseClassName): <stateme ...
- Java基础知识强化43:StringBuffer类之StringBuffer和String的相互转化
1. String和StringBuffer的相互转换 思想是:A-----B的转换,我们把A转换为B,其实是为了使用B的功能:B-----A的转换,我们可能的结果是A类型,所以还要转换回来 2. 案 ...
- 【转】UIKit性能调优实战讲解
文/bestswifter(简书作者)原文链接:http://www.jianshu.com/p/619cf14640f3著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 在使用UIKi ...
- NUnit单元测试初试
创建项目,创建几个方法 创建测试类 开启NUnit测试工具,新建一个测试项目 打开测试的程序集 选择节点,点击测试,绿色通过,红色说明有错误