源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

C#6.0中10大新特性的应用和总结

  • 时间:2020-09-17 17:45 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要: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。结果网上的教程不进人意,许久都没有更新,只好自己做一下总结。 [b]1.自动属性初始化(Auto-property initializers)[/b]
[u]复制代码[/u] 代码如下:
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不支持),也可以直接在构造函数里初始化
[u]复制代码[/u] 代码如下:
public class Customer {     public string Name { get; }     public Customer(string first, string last)     {         Name = first + " " + last;     } }
[b]2.字符串嵌入值(String interpolation)[/b] 在之前版本的String.Format中有多少个参数就要写多少个占位符还必须按照顺序,否则就报错.参数一多,这样搞的话确实头疼.新版本中在字符串前用$来标识后边的字符可以使用{对象}来作为占位符.看个例子.
[u]复制代码[/u] 代码如下:
Console.WriteLine($"年龄:{account.Age}  生日:{account.BirthDay.ToString("yyyy-MM-dd")}"); Console.WriteLine($"年龄:{account.Age}"); Console.WriteLine($"{(account.Age<=22?"小鲜肉":"老鲜肉")}");
如果想输出{或}符号,写两个即可,如$"{{". 注意这个$符号,网上的N多教程都是没有这个东东的.是直接"\{ account.Age \}",这种方式在新版本里已经被抛弃了. [b]3.导入静态类(Using Static)[/b] 像之前使用Math这个静态类的时候要先导入System命名空间后才能使用它.现在可以直接导入这个静态,然后代码中直接使用其函数.
[u]复制代码[/u] 代码如下:
using static System.Math;//注意这里不是命名空间哦   Console.WriteLine($"之前的使用方式: {Math.Pow(4, 2)}"); Console.WriteLine($"导入后可直接使用方法: {Pow(4,2)}");
注意这里是using static ... 如果某个命名空间下有n个方法,用这种方式直接引入单个静态类而不用引用所有方法还是挺方便的. [b]4.空值运算符(Null-conditional operators)[/b] 之前写过无数个这样的判断代码
[u]复制代码[/u] 代码如下:
if (*** != null) {      //不为null的操作 } return null;
现在使用可以简化这样方式.
[u]复制代码[/u] 代码如下:
var age = account.AgeList?[0].ToString();   Console.WriteLine("{0}", (person.list?.Count ?? 0));
如果account.AgeList为空则整个表达式返回空,否则后边的表达式的值. [b]5.对象初始化器(Index Initializers)[/b] 这种方式可以给字典或其他对象通过索引赋值初始化.
[u]复制代码[/u] 代码如下:
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: key: 1 value:first key: 2 value:second [b]6.异常过滤器(Exception filters)[/b]
[u]复制代码[/u] 代码如下:
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里面的方法. [b]7.nameof表达式 (nameof expressions)[/b] 在对方法参数进行检查时经常这样写:
[u]复制代码[/u] 代码如下:
private static void Add(Account account) {      if (account == null)          throw new ArgumentNullException("account"); }
如果某天参数的名字被修改了,下面的字符串很容易漏掉忘记修改. 使用nameof表达式后,编译的时候编译器将检查到有修改后自动导航与重构(-_-! 不知道翻译的对不对)
[u]复制代码[/u] 代码如下:
private static void Add(Account account) {      if (account == null)          throw new ArgumentNullException(nameof(account)); }
[b]8.在cath和finally语句块里使用await(Await in catch and finally blocks)[/b] c#5.0里是不支持这么写.
[u]复制代码[/u] 代码如下:
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. }
[b]9.在属性里使用Lambda表达式(Expression bodies on property-like function members)[/b]
[u]复制代码[/u] 代码如下:
public string Name =>string.Format("姓名: {0}", "summit");   public void Print() => Console.WriteLine(Name);
[b]10.在方法成员上使用Lambda表达式[/b]
[u]复制代码[/u] 代码如下:
static int LambdaFunc(int x, int y) => x*y;   public void Print() => Console.WriteLine(First + " " + Last);
关于C#6.0新增加的语言特性目前为止也就这么多.没有什么新功能,更多的是语法糖的改进.开发更舒服更快速. 
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部