C#6.0中10大新特性的应用和总结
微软于2015年7月21日发布了Visual Studio 2015,.NET 2015,.NET Framework 4.6,ASP.NET 4.6,Azure SDK 2.7 for .NET,C# 6.0,F# 4.0,TypeScript 1.5,Visual Studio Android 模拟器 等重量级开发产品。 由于项目升级到了.NetFramework 4.6.1,开发工具转向了VS2015,趁机尝试下C#6.0。结果网上的教程不进人意,许久都没有更新,只好自己做一下总结。 1.自动属性初始化(Auto-property initializers) 复制代码 代码如下: public class Account
{ public string Name { get; set; } = "summit"; public int Age { get; set; } = 22; public IList<int> AgeList { get; set; } = new List<int> { 10,20,30,40,50 }; } 对于只读属性也可以这样直接初始化(C#5.0不支持),也可以直接在构造函数里初始化 复制代码 代码如下: public class Customer { public string Name { get; } public Customer(string first,string last) { Name = first + " " + last; } } 2.字符串嵌入值(String interpolation) 在之前版本的String.Format中有多少个参数就要写多少个占位符还必须按照顺序,否则就报错.参数一多,这样搞的话确实头疼.新版本中在字符串前用$来标识后边的字符可以使用{对象}来作为占位符.看个例子. 复制代码 代码如下: Console.WriteLine($"年龄:{account.Age} 生日:{account.BirthDay.ToString("yyyy-MM-dd")}"); Console.WriteLine($"年龄:{account.Age}"); Console.WriteLine($"{(account.Age<=22?"小鲜肉":"老鲜肉")}"); 如果想输出{或}符号,写两个即可,如$"{{". 3.导入静态类(Using Static) 像之前使用Math这个静态类的时候要先导入System命名空间后才能使用它.现在可以直接导入这个静态,然后代码中直接使用其函数. 复制代码 代码如下: using static System.Math;//注意这里不是命名空间哦 Console.WriteLine($"之前的使用方式: {Math.Pow(4,2)}"); Console.WriteLine($"导入后可直接使用方法: {Pow(4,2)}"); 注意这里是using static ... 4.空值运算符(Null-conditional operators) 之前写过无数个这样的判断代码 复制代码 代码如下: if (*** != null)
{ //不为null的操作 } return null; 现在使用可以简化这样方式. 复制代码 代码如下: var age = account.AgeList?[0].ToString(); Console.WriteLine("{0}",(person.list?.Count ?? 0)); 如果account.AgeList为空则整个表达式返回空,否则后边的表达式的值. 5.对象初始化器(Index Initializers) 这种方式可以给字典或其他对象通过索引赋值初始化. 复制代码 代码如下: IDictionary<int,string> dict = new Dictionary<int,string>() { [1]="first", [2]="second" }; foreach(var dic in dict) { Console.WriteLine($"key: {dic.Key} value:{dic.Value}"); } output: 6.异常过滤器(Exception filters) 复制代码 代码如下: private static bool Log(Exception e) { Console.WriteLine("log"); return true; } static void TestExceptionFilter() { try { Int32.Parse("s"); } catch (Exception e) when (Log(e)) { Console.WriteLine("catch"); return; } } 当when()里面返回的值不为true,将持续抛出异常,不会执行catch里面的方法. 7.nameof表达式 (nameof expressions) 在对方法参数进行检查时经常这样写: 复制代码 代码如下: private static void Add(Account account) { if (account == null) throw new ArgumentNullException("account"); } 如果某天参数的名字被修改了,下面的字符串很容易漏掉忘记修改. 复制代码 代码如下: private static void Add(Account account) { if (account == null) throw new ArgumentNullException(nameof(account)); } 8.在cath和finally语句块里使用await(Await in catch and finally blocks) c#5.0里是不支持这么写. 复制代码 代码如下: Resource res = null; try { res = await Resource.OpenAsync(…); // You could do this. … } catch(ResourceException e) { await Resource.LogAsync(res,e); // Now you can do this … } finally { if (res != null) await res.CloseAsync(); // … and this. } 9.在属性里使用Lambda表达式(Expression bodies on property-like function members) 复制代码 代码如下: public string Name =>string.Format("姓名: {0}","summit"); public void Print() => Console.WriteLine(Name); 10.在方法成员上使用Lambda表达式 复制代码 代码如下: static int LambdaFunc(int x,int y) => x*y; public void Print() => Console.WriteLine(First + " " + Last); 关于C#6.0新增加的语言特性目前为止也就这么多.没有什么新功能,更多的是语法糖的改进.开发更舒服更快速. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |