C# 10个常用特性

1) async / await

使用 async / await 模式,可以在执行代码块操作的时候不会阻塞 UI 或者当前的线程。即使该操作被某些执行动作延迟了(比如一个 web 请求),async / await 模式也会继续执行后续的代码。

微软文档:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx

2) 对象 / 数组 / 集合的初始值设定项(initializers)

通过使用对象、数组、集合的初始值设定项,可以很容易地创建类、数组和集合的实例:

// 示例类

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)

4) ?? – null 合并运算符(Null coalescing operator)

当表达式左侧不为 null 的时候,?? 运算符返回其左侧的值,否则返回其右侧的值:

// 可能是 null

var someValue = service.GetValue();

var defaultValue = 23

// 如果 someValue 是 null 的话,result 为 23

var result = someValue ?? defaultValue;

?? 运算符可以用于链式操作:

string anybody = parm1 ?? localDefault ?? globalDefault;

它也可以将可空类型转换为非可空类型:

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 的一个新特性,可以通过更加高效和优雅的方式来进行字符串拼接:

// 传统方式

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 条件运算符使用起来如下所示:

// 如果 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)时,你可能会需要通过参数的名字来表示它:

public void PrintUserName(User currentUser)

{

// 在重命名 currentUser 的时候,重构工具可能会遗漏在文本中的这个变量名

if(currentUser == null)

_logger.Error("Argument currentUser is not provided");

//...

}

现在你可以这样来写:

public void PrintUserName(User currentUser)

{

// 重构工具不会漏掉这个

if(currentUser == null)

_logger.Error($"Argument {nameof(currentUser)} is not provided");

//...

}

文档:https://msdn.microsoft.com/zh-cn/library/dn986596.aspx

8) 属性初始值设定项 – C# 6

你可以通过属性初始值设定项,在声明一个属性的时候指定一个初始值:

public class User

{

public Guid Id { get; } = Guid.NewGuid();

// ...

}

使用属性初始

使用属性初始值设定项的一个好处,就是你不必声明一个 setter 方法,从而使得该属性成为不可变的(immutable)。属性初始值设定项可以和 C# 6 的主构造函数(Primary Constructor)语法配合使用。(译者注:Primary Constructor 语法可以让你在定义一个类的同时,在类名之后立即指定一个带参数的构造函数)

9) as / is 运算符

is 运算符用来判断一个实例是否是特定类型的,比如你想看一下类型转换是否是可行的:

if (Person is Adult)

{

//do stuff

}

as 运算符会试图将某个对象转换为某个特定类的实例。如果无法转换的话会返回 null:

SomeType y = x as SomeType;

if (y != null)

{

//do stuff

}

10) yield 关键字

你可以通过 yield 关键字来返回 IEnumerable 接口的数据项。下面的示例会返回 2 的次方(比如直到 8 次方:2、4、8、16、32、64、128、256):

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 会变得非常强大。它使得你延迟生成序列中的对象,比如当系统不需要枚举整个集合的时候,可以按需停止。

时间: 2024-11-09 06:40:53

C# 10个常用特性的相关文章

MVC常用特性

MVC常用特性使用 简介 在以前的文章中,我和大家讨论如何用SingalR和数据库通知来完成一个消息监控应用. 在上一篇文章中,我介绍了如何在MVC中对MongoDB进行CRUD操作. 今天,我将继续介绍一些在开发中非常有用的MVC特性,如下: BindAttribute Remote HandleError HiddenInput BindAttribute 使用BindAttribute的目的是限制用户在提交form表单时使用合适且正确的值.当我们提交一个表单时,就会检查每一个实体上绑定的特

ArcGIS 10.2新特性介绍:影像

1.新增栅格类型 新增支持三种新的栅格类型:DMCii.Pleiades 和 SPOT6. 同时,新增提供中国卫星 Raster Type 扩展下载,支持中国卫星影像数据在ArcGIS 中的管理和使用.扩展支持的卫星产品包括: HJ 1A/1B CCD raster type ZY02C HRC raster type ZY02C PMS raster type ZY3 – CRESDA ZY3 – SASMAC 对于支持的国产卫星,正射.融合.镶嵌和匀色等常用处理,通过 ArcGIS 的On-

AngularJS 的常用特性(五)

13.使用路由和 $location 切换视图 对于一些单页面应用来说,有时候需要为用户展示或者隐藏一些子页面视图,可以利用 Angular 的 $route 服务来管理这种场景. 你可以利用路由服务来定义这样的一种东西:对于浏览器所指向的特定 URL,Angular 将会加载并显示一个模板,并实例化一个控制器来为模板提供内容. 在应用中可以调用 $routeProvider 服务上的函数来创建路由,把需要创建的路由当成一个配置块传给这些函数即可.伪代码如下: 1 var someModule

Vue的常用特性

Vue的常用特性 一.表单基本操作 都是通过v-model 单选框 1. 两个单选框需要同时通过v-model 双向绑定 一个值 2. 每一个单选框必须要有value属性 且value值不能一样 3. 当某一个单选框选中的时候 v-model 会将当前的 value值 改变 data 中的 数据 gender 的值就是选中的值,我们只需要实时监控他的值就可以了 <input type="radio" id="male" value="1"

C#网络程序设计(1)网络编程常识与C#常用特性

    网络程序设计能够帮我们了解联网应用的底层通信原理!     (1)网络编程常识: 1)什么是网络编程 只有主要实现进程(线程)相互通信和基本的网络应用原理性(协议)功能的程序,才能算是真正的网络编程. 2)网络编程的层次 现实中的互联网是按照"TCP/IP分层协议栈"的体系结构构建的,因此程序员必须搞清楚自己要做的是哪个层次上的编程工作. TCP/IP协议体系的实现情况: 其中,网络接口层已经被大多数计算机生产厂家集成在了主板上,也就是经常所说的网卡(NIC).windows操

Spark整合kafka0.10.0新特性(二)

接着Spark整合kafka0.10.0新特性(一)开始 import org.apache.kafka.clients.consumer.ConsumerRecord import org.apache.kafka.common.serialization.StringDeserializer import org.apache.spark.streaming.kafka010._ import org.apache.spark.streaming.kafka010.LocationStrat

封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类

快速开发系列 10个常用工具类 http://blog.csdn.net/lmj623565791/article/details/38965311 ------------------------------------------------------------------------------------------------ 不知众多Android开发者是否在程序开发的工程中也遇到过下面的问题: 0.如何在众多log中快速找到你设置打印的那行log? 1.是否还在不断的切换标签来

10个常用的ps命令总结,参数

Linux系统中10个常用的ps命令总结 PS 命令是什么 查看它的man手册可以看到,ps命令能够给出当前系统中进程的快照.它能捕获系统在某一事件的进程状态.如果你想不断更新查看的这个状态,可以使用top命令. ps命令支持三种使用的语法格式 UNIX 风格,选项可以组合在一起,并且选项前必须有"-"连字符    BSD 风格,选项可以组合在一起,但是选项前不能有"-"连字符    GNU 风格的长选项,选项前有两个"-"连字符 我们能够混用这

Java 9和Java 10的新特性

http://www.infoq.com/cn/news/2014/09/java9 Java 9新特性汇总 继2014年3月份Java 8发布之后,Open JDK加快了开发速度, Java 9的发布已经提上日程.预计在2016年发布Java 9,同时公布了JEP(JDK改进提议)中的前期列表.任职于Takipi 的Alex Zhitnitsky整理了Java 9中一些纳入JSR(Java规范提案)的新特性和大家一直期待但未确定的一些特性.这些特性有Jigsaw项目.新的智能编译工具.期待已久