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 ...
随机推荐
- 你该学点HTML/CSS知识的9大理由
每个人都应该学写代码——这一观点简直就是铺天盖地地映入我们眼帘.或许你会莫名其妙,程序员学代码那是理所应当,但是作为一个作家.营销人员.财务工作者甚至是工人,为什么也需要学习代码呢? 好吧,下面我会告 ...
- Android ListView嵌套Button,Button事件覆盖item事件解决办法
方法就是修改item布局的xml文件: 在根布局里加上: android:descendantFocusability="blocksDescendants" 然后在按钮布局里加上 ...
- java中post和get请求
示例代码: package com.shareboxes.util; import java.io.BufferedReader; import java.io.IOException; import ...
- xss漏洞校验
Xss(跨站脚本攻击)大家应该已经都有所了解,下面讲讲怎样查找xss漏洞吧. 确定xss漏洞的基本方法是使用攻击字符串来验证的,例如”><script>alert(document. ...
- Linux安装配置php
1.获取安装文件: http://www.php.net/downloads.php php-5.3.8.tar.gz 获取安装php需要的支持文件:http://download.csdn.net ...
- [React Testing] Element types with Shallow Rendering
When you render a component with the Shallow Renderer, you have access to the underlying object. We ...
- HTML5和CSS3实例教程[总结二]
基于contenteditable属性实现在位编辑 HTML5规范引入了contenteditable属性,它几乎可以用在任何元素上,只要添加这一属性 即可变为可编译区域 <!DOCTYPE h ...
- JAVA-FileInputStream之read方法
今天一个友询问FileInputStrem方法的read()和read(byte b) 方法为什么都用-1来判断读文件结束的问题,在此和大家一起学习下. 关于FileInputStream 它用于读取 ...
- oralce 恢复Delete删除
select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; select * from db_datatable as of timestam ...
- ORACLE创建OEM是老爱报的错误【weber出品】
还是采用静默安装,手工建库完成后.在安装的OEM的时候一直报这个错误.这里稍微记载以下解决方案: Database connection through listener failed. Fix th ...