C# 6新特性简单总结
最近在看《C#高级编程 C# 6&.NET Core 1.0》,会做一些读书笔记,也算对知识的总结与沉淀了。
1.静态的using声明
静态的using声明允许调用静态方法时不使用类名:
1 // C# 5 2 using System; 3 4 Console.WriteLine("C# 5"); 5 6 // C# 6 7 using static System.Console; 8 9 WriteLine("C# 6");
2.表达式体方法
表达式体方法只包含一个可以用Lambda语法编写的语句:
1 // C# 5 2 public bool IsSquare(Rectangle rect) 3 { 4 return rect.Width == rect.Height; 5 } 6 7 // C# 6 8 public bool IsSquare(Rectangle rect) => rect.Width == rect.Height;
3.表达式体属性
与表达式体方法类似,只有get存储器的单行属性可以用Lambda语法编写:
1 // C# 5 2 public string FullName 3 { 4 get 5 { 6 return FirstName + " " + LastName; 7 } 8 } 9 10 // C# 6 11 public string FullName => FirstName + " " + LastName;
4.自动实现的属性初始化器
自动实现的属性可以用属性初始化器来初始化:
1 // C# 5 2 public class Person 3 { 4 public Person() 5 { 6 Age = 24; 7 } 8 public int Age { get; set; } 9 } 10 11 // C# 6 12 public class Person 13 { 14 public int Age { get; set; } = 24; 15 }
5.只读的自动属性
1 // C# 5 2 private readonly int _bookId; 3 public BookId 4 { 5 get 6 { 7 return _bookId; 8 } 9 } 10 11 // C# 6 12 private readonly int _bookId; 13 public BookId { get; }
6.nameof运算符
使用新的nameof运算符,可以访问字段名、属性名、方法名和类型名。这样,在重构时就不会遗漏名称的改变:
1 // C# 5 2 public void Method(object o) 3 { 4 if(o == null) 5 { 6 throw new ArgumentNullException("o"); 7 } 8 } 9 10 // C# 6 11 public void Method(object o) 12 { 13 if(o == null) 14 { 15 throw new ArgumentNullException(nameof(o)); 16 } 17 }
7.空值传播运算符
空值传播运算符简化了空值的检查:
1 // C# 5 2 int? age = p == null ? null : p.Age; 3 4 // C# 6 5 int? age = p?.Age;
8.字符串插值
字符串插值删除了对string.Format的调用,它不在字符串中使用编号的格式占位符,占位符可以包含表达式:
1 // C# 5 2 public override string ToString() 3 { 4 return string.Format("{0},{1}", Title, Publisher); 5 } 6 7 // C# 6 8 public override string ToString() => $"{Title}{Publisher}";
9.字典初始化
1 // C# 5 2 var dic = new Dictionary<int, string>(); 3 dic.Add(3, "three"); 4 dic.Add(7, "seven"); 5 6 // C# 6 7 var dic = new Dictionary<int, string>() 8 { 9 [3] = "three", 10 [7] = "seven" 11 };
10.异常过滤器
异常过滤器允许在捕获异常之前过滤它们:
1 // C# 5 2 try 3 { 4 // 5 } 6 catch (MyException ex) 7 { 8 if (ex.ErrorCode != 405) throw; 9 } 10 11 // C# 6 12 try 13 { 14 // 15 } 16 catch (MyException ex) when (ex.ErrorCode == 405) 17 { 18 // 19 }
11.catch中的await
await现在可以在catch子句中使用,C# 5需要一种变通方法:
1 // C# 5 2 bool hasError = false; 3 string errorMsg = null; 4 try 5 { 6 // 7 } 8 catch (MyException ex) 9 { 10 hasError = true; 11 errorMsg = ex.Message; 12 } 13 if (hasError) 14 { 15 await new MessageDialog().ShowAsync(errorMsg); 16 } 17 18 // C# 6 19 try 20 { 21 // 22 } 23 catch (MyException ex) 24 { 25 await new MessageDialog().ShowAsync(ex.Message); 26 }