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 {getset;}
    public DateTime StartDate {getset;}
}
 
// 使用初始值设定项创建员工实例
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# 特性的更多相关文章

  1. 使用 PyTorch Lightning 将深度学习管道速度提高 10 倍

    ​  前言  本文介绍了如何使用 PyTorch Lightning 构建高效且快速的深度学习管道,主要包括有为什么优化深度学习管道很重要.使用 PyTorch Lightning 加快实验周期的六种 ...

  2. 深度学习与CV教程(10) | 轻量化CNN架构 (SqueezeNet,ShuffleNet,MobileNet等)

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...

  3. Java 10的10个新特性,将彻底改变你写代码的方式!

    Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...

  4. fir.im Weekly - 从 iOS 10 SDK 新特性说起

    从 iOS 7 翻天覆地的全新设计,iOS 8 中 Size Classes 的出现,应用扩展,以及 Cloud Kit 的加入,iOS 9 的分屏多任务特性,今年的 WWDC iOS 10 SDK ...

  5. Java 10 的 10 个新特性,将彻底改变你写代码的方式!

    Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...

  6. Java 10 的 10 个新特性,你颤抖了吗?

    Java 9才发布几个月,很多玩意都没整明白,现在Java 10又快要来了.. 这时候我真尼玛想说:线上用的JDK 7 甚至JDK 6,JDK 8 还没用熟,JDK 9 才发布不久不知道啥玩意,JDK ...

  7. JavaSE学习笔记(3)---面向对象三大特性

    JavaSE学习笔记(3)---面向对象三大特性 面向对象的三大特征:继承.封装.多态 1.封装 面向对象编程语言是对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改.然 ...

  8. 【ArcGIS 10.2新特性】ArcGIS Online新特性(上)

    概述 7月,ArcGIS Online发布了很多更新.主要内容有:新的网站设计,增强了Web制图,数据分析,应用程序创建,以及机构管理等功能. 更新的大致内容总结如下: 地图查看器:新的分析工具.获取 ...

  9. 【ArcGIS 10.2新特性】ArcGIS 10.2 for Desktop 新特性(二)

    4 三维 4.1 共享三维场景         用户能够将ArcScene文档导出为3D web场景,能够被加载到ArcGIS Online.Portal或本地Web服务器上并进行分享.这样,用户可以 ...

随机推荐

  1. web开发中的多线程死锁问题,避免死锁

    1.什么是死锁,产生死锁的原因,和产生死锁的必要条件 所谓死锁(DeadLock),是指多个进程或线程在运行过程中因争夺资源而造成的一种僵局,当进程或线程处于僵局时,若无外力作用,它们将无法再向前推进 ...

  2. easyui datagrid 前台分页

    核心方法 //分页data function pagerFilter(data, pagegrid) { if (typeof data.length == 'number' && t ...

  3. 如何给TableLayout加边框

    呵呵,其实很简单 就是将TableLayout定义一种颜色,在给TableRow定义一种颜色.通过TableRow的layout_margin挤出一个像素的宽度就变成了TableLayout的宽度.这 ...

  4. linux服务创建及jq配置服务列表查看

    1.应用背景 随着业务需求,后台处理服务不断增多,对于这些服务或后台程序的查看.更新操作越来越凌乱,所以我们首先需要一个服务列表查看工具,方便查看各 服务的端口.运行状态.jar包路径等等. 2.创建 ...

  5. 在PHP中连接数据库时获取最后的一个ID

    在SQL中获取最后的一个id  只需要加上where条件对id进行排序就可以了 但是在PHP中  有一种最新的方法  使用mysql_insert_id();就可以获得最大的id  .

  6. C#函数式程序设计之泛型

    Intellij修改archetype Plugin配置 2014-03-16 09:26 by 破狼, 204 阅读, 0 评论,收藏, 编辑 Maven archetype plugin为我们提供 ...

  7. 运动检测(前景检测)之(二)混合高斯模型GMM

    运动检测(前景检测)之(二)混合高斯模型GMM zouxy09@qq.com http://blog.csdn.net/zouxy09 因为监控发展的需求,目前前景检测的研究还是很多的,也出现了很多新 ...

  8. twitter 授权过程

    转自:http://blog.csdn.net/yangjian8915/article/details/11816669 官方的流程图如下: 下面开始一步步讲解,如何获取最终的access_toke ...

  9. IL代码完结篇

    读懂IL代码就这么简单(三)完结篇   一 前言 写了两篇关于IL指令相关的文章,分别把值类型与引用类型在 堆与栈上的操作区别详细的写了一遍这第三篇也是最后一篇,之所以到第三篇就结束了,是因为以我现在 ...

  10. 关于GNU软件的版本号命名规则

    这里所说的版本号命名并非指“正式版”.“测试版”这种方式,而是在讨论版本编号的问题,例如Linux内核3.0以后的版本命名规则是3.A.B,A是内核的版本,B是安全补丁.那么对于一般的软件的版本号命名 ...