C# 10个常用特性汇总
1)async/await
使用async/await模式,可以在执行代码块操作的时候不会阻塞UI或者当前的线程。即使该操作被某些执行动作延迟了(比如一个web请求),async/await模式也会继续执行后续的代码。
微软文档:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx
2)对象/数组/集合的初始值设定项(initializers)
通过使用对象、数组、集合的初始值设定项,可以很容易地创建类、数组和集合的实例:
//示例类 publicclassEmployee{ publicstringName{get;set;} publicDateTimeStartDate{get;set;} } //使用初始值设定项创建员工实例 Employeeemp=newEmployee{Name="JohnSmith",StartDate=DateTime.Now()};
上述示例中的代码在单元测试中可能非常有帮助,不过在有些情况下也应该避免使用它,比如应该通过构造函数来进行类的实例化的时候。
微软文档:https://msdn.microsoft.com/zh-cn/library/bb384062.aspx
3)Lambda表达式、谓词委托(predicates)、委托(delegates)和闭包(closures)
4)??–null合并运算符(Nullcoalescingoperator)
当表达式左侧不为null的时候,??运算符返回其左侧的值,否则返回其右侧的值:
//可能是null varsomeValue=service.GetValue(); vardefaultValue=23 //如果someValue是null的话,result为23 varresult=someValue??defaultValue;
??运算符可以用于链式操作:
stringanybody=parm1??localDefault??globalDefault;
它也可以将可空类型转换为非可空类型:
vartotalPurchased=PurchaseQuantities.Sum(kvp=>kvp.Value??0);
文档:https://msdn.microsoft.com/zh-cn/library/ms173224.aspx
5)$”{x}”–内插字符串(StringInterpolation)-C#6
C#6的一个新特性,可以通过更加高效和优雅的方式来进行字符串拼接:
//传统方式 varsomeString=String.Format("Somedata:{0},somemoredata:{1}",someVariable,someOtherVariable); //新的方式 varsomeString=$"Somedata:{someVariable},somemoredata:{someOtherVariable}";
也可以在大括号中写C#表达式,这让它变得非常强大。
6)?.–null条件运算符(Null-conditionaloperator)–C#6
null条件运算符使用起来如下所示:
//如果customer或customer.profile或customer.profile.age为null的话,结果都是null varcurrentAge=customer?.profile?.age;
不再会发生NullReferenceExceptions了!
文档:https://msdn.microsoft.com/zh-cn/library/dn986595.aspx
7)nameof表达式–C#6
新的nameof表达式可能看上去没那么重要,不过它确实也有其用武之地。在使用自动重构工具(比如Resharper)时,你可能会需要通过参数的名字来表示它:
publicvoidPrintUserName(UsercurrentUser) { //在重命名currentUser的时候,重构工具可能会遗漏在文本中的这个变量名 if(currentUser==null) _logger.Error("ArgumentcurrentUserisnotprovided"); //... }
现在你可以这样来写:
publicvoidPrintUserName(UsercurrentUser) { //重构工具不会漏掉这个 if(currentUser==null) _logger.Error($"Argument{nameof(currentUser)}isnotprovided"); //... }
文档:https://msdn.microsoft.com/zh-cn/library/dn986596.aspx
8)属性初始值设定项–C#6
你可以通过属性初始值设定项,在声明一个属性的时候指定一个初始值:
publicclassUser { publicGuidId{get;}=Guid.NewGuid(); //... }
使用属性初始
使用属性初始值设定项的一个好处,就是你不必声明一个setter方法,从而使得该属性成为不可变的(immutable)。属性初始值设定项可以和C#6的主构造函数(PrimaryConstructor)语法配合使用。(译者注:PrimaryConstructor语法可以让你在定义一个类的同时,在类名之后立即指定一个带参数的构造函数)
9)as/is运算符
is运算符用来判断一个实例是否是特定类型的,比如你想看一下类型转换是否是可行的:
if(PersonisAdult) { //dostuff }
as运算符会试图将某个对象转换为某个特定类的实例。如果无法转换的话会返回null:
SomeTypey=xasSomeType; if(y!=null) { //dostuff }
10)yield关键字
你可以通过yield关键字来返回IEnumerable接口的数据项。下面的示例会返回2的次方(比如直到8次方:2、4、8、16、32、64、128、256):
publicstaticIEnumerablePower(intnumber,intexponent) { intresult=1; for(inti=0;i 如果使用得当的话,yield会变得非常强大。它使得你延迟生成序列中的对象,比如当系统不需要枚举整个集合的时候,可以按需停止。
以上就是C#10个常用特性汇总的详细内容,更多关于C#常用特性的资料请关注毛票票其它相关文章!