你确实应该学习并使用的 10 个 C# 特性
1) async / await
使用 async / await 模式,可以在执行代码块操作的时候不会阻塞 UI 或者当前的线程。即使该操作被某些执行动作延迟了(比如一个 web 请求),async / await 模式也会继续执行后续的代码。
更多关于 async / await 模式的内容,请见:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx
2) 对象 / 数组 / 集合的初始值设定项(initializers)
通过使用对象、数组、集合的初始值设定项,可以很容易地创建类、数组和集合的实例:
1
2
3
4
5
6
7
8
|
// 示例类 public class Employee { public string Name { get ; set ;} public DateTime StartDate { get ; set ;} } // 使用初始值设定项创建员工实例 Employee emp = new Employee {Name= "John Smith" , StartDate=DateTime.Now()}; |
上述示例中的代码在单元测试中可能非常有帮助,不过在有些情况下也应该避免使用它,比如应该通过构造函数来进行类的实例化的时候。
更多关于初始值设定项的内容,请见:https://msdn.microsoft.com/zh-cn/library/bb384062.aspx
3) Lambda 表达式、谓词委托(predicates)、委托(delegates)和闭包(closures)
这些特性在很多情况下都是非常必要的(比如使用 Linq 的时候),请务必学习在何时以及如何使用它们。
更多关于 Lambda 表达式、谓词委托、委托和闭包的内容,请见:http://www.codeaddiction.net/articles/13/lambda-expressions-delegates-predicates-and-closures-in-c
4) ?? – null 合并运算符(Null coalescing operator)
当表达式左侧不为 null 的时候,?? 运算符返回其左侧的值,否则返回其右侧的值:
1
2
3
4
5
6
|
// 可能是 null var someValue = service.GetValue(); var defaultValue = 23 // 如果 someValue 是 null 的话,result 为 23 var result = someValue ?? defaultValue; |
?? 运算符可以用于链式操作:
1
|
string anybody = parm1 ?? localDefault ?? globalDefault; |
它也可以将可空类型转换为非可空类型:
1
|
var totalPurchased = PurchaseQuantities.Sum(kvp => kvp.Value ?? 0); |
更多关于 ?? 运算符的内容,请见:https://msdn.microsoft.com/zh-cn/library/ms173224.aspx
5) $”{x}” – 内插字符串(String Interpolation)- C# 6
C# 6 的一个新特性,可以通过更加高效和优雅的方式来进行字符串拼接:
1
2
3
4
5
|
// 传统方式 var someString = String.Format( "Some data: {0}, some more data: {1}" , someVariable, someOtherVariable); // 新的方式 var someString = $ "Some data: {someVariable}, some more data: {someOtherVariable}" ; |
也可以在大括号中写 C# 表达式,这让它变得非常强大。
6) ?. – null 条件运算符(Null-conditional operator) – C# 6
null 条件运算符使用起来如下所示:
1
2
|
// 如果 customer 或 customer.profile 或 customer.profile.age 为 null 的话,结果都是 null var currentAge = customer?.profile?.age; |
不再会发生 NullReferenceExceptions 了!
更多关于 ?. 运算符的内容,请见:https://msdn.microsoft.com/zh-cn/library/dn986595.aspx
7) nameof 表达式 – C# 6
新的 nameof 表达式可能看上去没那么重要,不过它确实也有其用武之地。在使用自动重构工具(比如 Resharper)时,你可能会需要通过参数的名字来表示它:
1
2
3
4
5
6
7
8
|
public void PrintUserName(User currentUser) { // 在重命名 currentUser 的时候,重构工具可能会遗漏在文本中的这个变量名 if (currentUser == null ) _logger.Error( "Argument currentUser is not provided" ); //... } |
现在你可以这样来写:
1
2
3
4
5
6
7
8
|
public void PrintUserName(User currentUser) { // 重构工具不会漏掉这个 if (currentUser == null ) _logger.Error($ "Argument {nameof(currentUser)} is not provided" ); //... } |
更多关于 nameof 表达式的内容,请见:https://msdn.microsoft.com/zh-cn/library/dn986596.aspx
8) 属性初始值设定项 – C# 6
你可以通过属性初始值设定项,在声明一个属性的时候指定一个初始值:
1
2
3
4
5
|
public class User { public Guid Id { get ; } = Guid.NewGuid(); // ... } |
使用属性初始值设定项的一个好处,就是你不必声明一个 setter 方法,从而使得该属性成为不可变的(immutable)。属性初始值设定项可以和 C# 6 的主构造函数(Primary Constructor)语法配合使用。(译者注:Primary Constructor 语法可以让你在定义一个类的同时,在类名之后立即指定一个带参数的构造函数)
9) as / is 运算符
is 运算符用来判断一个实例是否是特定类型的,比如你想看一下类型转换是否是可行的:
1
2
3
4
|
if (Person is Adult) { //do stuff } |
as 运算符会试图将某个对象转换为某个特定类的实例。如果无法转换的话会返回 null:
1
2
3
4
5
|
SomeType y = x as SomeType; if (y != null ) { //do stuff } |
10) yield 关键字
你可以通过 yield 关键字来返回 IEnumerable 接口的数据项。下面的示例会返回 2 的次方(比如直到 8 次方:2、4、8、16、32、64、128、256):
1
2
3
4
5
6
7
8
9
|
public static IEnumerable< int > Power( int number, int exponent) { int result = 1; for ( int i = 0; i < exponent; i++) { result = result * number; yield return result; } } |
如果使用得当的话,yield 会变得非常强大。它使得你延迟生成序列中的对象,比如当系统不需要枚举整个集合的时候,可以按需停止。
你确实应该学习并使用的 10 个 C# 特性的更多相关文章
- 使用 PyTorch Lightning 将深度学习管道速度提高 10 倍
前言 本文介绍了如何使用 PyTorch Lightning 构建高效且快速的深度学习管道,主要包括有为什么优化深度学习管道很重要.使用 PyTorch Lightning 加快实验周期的六种 ...
- 深度学习与CV教程(10) | 轻量化CNN架构 (SqueezeNet,ShuffleNet,MobileNet等)
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- Java 10的10个新特性,将彻底改变你写代码的方式!
Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...
- fir.im Weekly - 从 iOS 10 SDK 新特性说起
从 iOS 7 翻天覆地的全新设计,iOS 8 中 Size Classes 的出现,应用扩展,以及 Cloud Kit 的加入,iOS 9 的分屏多任务特性,今年的 WWDC iOS 10 SDK ...
- Java 10 的 10 个新特性,将彻底改变你写代码的方式!
Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...
- Java 10 的 10 个新特性,你颤抖了吗?
Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...
- JavaSE学习笔记(3)---面向对象三大特性
JavaSE学习笔记(3)---面向对象三大特性 面向对象的三大特征:继承.封装.多态 1.封装 面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改.然 ...
- 【ArcGIS 10.2新特性】ArcGIS Online新特性(上)
概述 7月,ArcGIS Online发布了很多更新.主要内容有:新的网站设计,增强了Web制图,数据分析,应用程序创建,以及机构管理等功能. 更新的大致内容总结如下: 地图查看器:新的分析工具.获取 ...
- 【ArcGIS 10.2新特性】ArcGIS 10.2 for Desktop 新特性(二)
4 三维 4.1 共享三维场景 用户能够将ArcScene文档导出为3D web场景,能够被加载到ArcGIS Online.Portal或本地Web服务器上并进行分享.这样,用户可以 ...
随机推荐
- Wijmo 5 + Ionic Framework之:Hello World!
Wijmo 5 + Ionic Framework之:Hello World! 本教程中,我们用Wijmo 5 和 Ionic Framework实现一个Mobile的工程:Hello World. ...
- iscroll4实现轮播图效果
相信很多人和我一样,在使用iscroll的是时候只知道可以手动滑动,不知道iscroll的轮播怎么实现一下就是我做的一个轮播效果,亲测有效: 1.html,当然可以动态添加下面的小圆点 <div ...
- 自己写RTPserver——大约RTP协议
自己写RTPserver--大约RTP协议 本文将带领你一步一步地实现一个简单的手RTP变速器server,旨在了解RTP流媒体传输协议以及有关多媒体编解码器的一些知识. RTP协议的必备知识 要动手 ...
- 调式WP程序报0x80131500错误的解决办法
在虚拟机上安装了win8系统和VS2013,但是在允许第一个WP程序时,居然报0x80131500错误信息,经查询原来是VS2013需更新的问题,如果你用的是VS2012,但是又系统升级到了win8. ...
- 用户故事(User Story)
用户故事(User Story) 用户故事是描述对用户有价值的功能,好的用户故事应该包括角色.功能和商业价值三个要素.用户故事通常的格式为:作为一个<角色>, 我想要<功 ...
- 增删查改-MySQL
查询: 在MySQL中,select的基本语法形式: select 属性列表 from 表名和视图 [where 条件表达式] [group by 属性名 [having 条件表达式]] [order ...
- vs2013使用初体验
刚安装好vs2013 , 初步体验了一把, 下面是我目前感受到的改变(对比vs2012) 1. 任务栏图标变了 (左边vs2013, 右边vs2012) 2. 开始界面 (vs2012有ligh ...
- ecexl操作
/// <summary> /// 写入ecexl /// </summary> /// <param name="dt"></param ...
- Bundles
Bundles 接着在Global.asax文件的Application_Start方法中调用BundleConfig.RegisterBundles方法: protected void Applic ...
- 7z文件格式及其源码的分析
7z文件格式及其源码的分析 本文是一个系列. 主要是分享我最近一年做7z文件开发的经验. 主要包括7z官方源码的结构分析, 以及7z文件格式的分析. 其中涉及到7z源码结构的各个细节, 以及7z文件格 ...