C#6.0中10大新特性的应用和总结
微软于2015年7月21日发布了VisualStudio2015,.NET2015,.NETFramework4.6,ASP.NET4.6,AzureSDK2.7for.NET,C#6.0,F#4.0,TypeScript1.5,VisualStudioAndroid模拟器等重量级开发产品。
由于项目升级到了.NetFramework4.6.1,开发工具转向了VS2015,趁机尝试下C#6.0。结果网上的教程不进人意,许久都没有更新,只好自己做一下总结。
1.自动属性初始化(Auto-propertyinitializers)
publicclassAccount { publicstringName{get;set;}="summit"; publicintAge{get;set;}=22; publicIList<int>AgeList { get; set; }=newList<int>{10,20,30,40,50}; }
对于只读属性也可以这样直接初始化(C#5.0不支持),也可以直接在构造函数里初始化
publicclassCustomer { publicstringName{get;} publicCustomer(stringfirst,stringlast) { Name=first+""+last; } }
2.字符串嵌入值(Stringinterpolation)
在之前版本的String.Format中有多少个参数就要写多少个占位符还必须按照顺序,否则就报错.参数一多,这样搞的话确实头疼.新版本中在字符串前用$来标识后边的字符可以使用{对象}来作为占位符.看个例子.
Console.WriteLine($"年龄:{account.Age} 生日:{account.BirthDay.ToString("yyyy-MM-dd")}"); Console.WriteLine($"年龄:{account.Age}"); Console.WriteLine($"{(account.Age<=22?"小鲜肉":"老鲜肉")}");
如果想输出{或}符号,写两个即可,如$"{{".
注意这个$符号,网上的N多教程都是没有这个东东的.是直接"\{account.Age\}",这种方式在新版本里已经被抛弃了.
3.导入静态类(UsingStatic)
像之前使用Math这个静态类的时候要先导入System命名空间后才能使用它.现在可以直接导入这个静态,然后代码中直接使用其函数.
usingstaticSystem.Math;//注意这里不是命名空间哦 Console.WriteLine($"之前的使用方式:{Math.Pow(4,2)}"); Console.WriteLine($"导入后可直接使用方法:{Pow(4,2)}");
注意这里是usingstatic...
如果某个命名空间下有n个方法,用这种方式直接引入单个静态类而不用引用所有方法还是挺方便的.
4.空值运算符(Null-conditionaloperators)
之前写过无数个这样的判断代码
if(***!=null) { //不为null的操作 } returnnull;
现在使用可以简化这样方式.
varage=account.AgeList?[0].ToString(); Console.WriteLine("{0}",(person.list?.Count??0));
如果account.AgeList为空则整个表达式返回空,否则后边的表达式的值.
5.对象初始化器(IndexInitializers)
这种方式可以给字典或其他对象通过索引赋值初始化.
IDictionary<int,string>dict=newDictionary<int,string>(){ [1]="first", [2]="second" }; foreach(vardicindict) { Console.WriteLine($"key:{dic.Key}value:{dic.Value}"); }
output:
key:1value:first
key:2value:second
6.异常过滤器(Exceptionfilters)
privatestaticboolLog(Exceptione) { Console.WriteLine("log"); returntrue; } staticvoidTestExceptionFilter() { try { Int32.Parse("s"); } catch(Exceptione)when(Log(e)) { Console.WriteLine("catch"); return; } }
当when()里面返回的值不为true,将持续抛出异常,不会执行catch里面的方法.
7.nameof表达式(nameofexpressions)
在对方法参数进行检查时经常这样写:
privatestaticvoidAdd(Accountaccount) { if(account==null) thrownewArgumentNullException("account"); }
如果某天参数的名字被修改了,下面的字符串很容易漏掉忘记修改.
使用nameof表达式后,编译的时候编译器将检查到有修改后自动导航与重构(-_-!不知道翻译的对不对)
privatestaticvoidAdd(Accountaccount) { if(account==null) thrownewArgumentNullException(nameof(account)); }
8.在cath和finally语句块里使用await(Awaitincatchandfinallyblocks)
c#5.0里是不支持这么写.
Resourceres=null; try { res=awaitResource.OpenAsync(…); //Youcoulddothis. … } catch(ResourceExceptione) { awaitResource.LogAsync(res,e); //Nowyoucandothis… } finally { if(res!=null)awaitres.CloseAsync();//…andthis. }
9.在属性里使用Lambda表达式(Expressionbodiesonproperty-likefunctionmembers)
publicstringName=>string.Format("姓名:{0}","summit"); publicvoidPrint()=>Console.WriteLine(Name);
10.在方法成员上使用Lambda表达式
staticintLambdaFunc(intx,inty)=>x*y; publicvoidPrint()=>Console.WriteLine(First+""+Last);
关于C#6.0新增加的语言特性目前为止也就这么多.没有什么新功能,更多的是语法糖的改进.开发更舒服更快速.