C#6新特性
在C#6中有一个新的C#编译器。它完成源码的清理。现在自定义程序也可以使用编译器管道的特性,并使用Visual Studio的许多特性。
这个新的C#编译器平台允许用许多新特性改进C#。虽然这些特性都没有LINQ或async关键字影响大,但许多改进都提高了开发人员的效率。C#6有哪些变化?
0.3.1 静态的using声明
C# 5
using System;
Console.WriteLine("Hello,World!");
C# 6
using static System.Console;
WirteLine("Hello,World!");
0.3.2 表达式体方法
表达式体方法只包括一个可以用lambda语法编写的语句:
C#5
public bool IsSquare(int num)
{
return num == 0;
}
C#6
public bool IsSquare(int num) => num == 0;
0.3.3 表达式体属性
与表达式体方法类似,只有get存取器的单行属性可以用lambda语法编写:
C#5
public string FullName
{
get
{
return FirstName + " " + LastName;
}
}
C#6
public string FullName => FirstName + " " + LastName;
0.3.4 自动实现的属性初始化器
C#5
public class Person
{
public Person()
{
Age = 24;
}
public int Age {get; set;}
}
C#6
public class Person
{
public int Age {get; set;} = 42;
}
0.3.5 只读的自动属性
为了实现只读属性,C#5需要使用完整的属性语法;而在C#6中,可以使用自动实现的属性:
C#5
private readonly int _bookId;
public int BookId {
get
{
return _bookId;
}
}
C#6
public int BookIdTest { get; }
0.3.6 nameof 运算符
使用新的nameof运算符,可以访问字段名、属性名、方法名或者类型名。这样,在重构时,就不会遗漏名称的改变:
C#5
public void Method(object o)
{
if (o == null) throw new System.ArgumentNullException("o");
}
C#6
public void MethodTest(object o)
{
if (o == null) throw new System.ArgumentNullException(nameof(o));
}
0.3.7 空值传播运算符
空值传播运算符简化了空值的检查:
C#5
int? age = p = null ? null : p.Age;
C#6
int? age = p?.Age;
C#5
var handler = Event;
if(handler != null)
{
handler(source,e)
}
C#6
handler?.Invoke(source,e)
0.3.8 字符串插值
字符串插值删除了对string.Format的调用,它不在字符串中使用编号的格式占位符,占位符可以包含表达式:
C#5
public override ToString()
{
return string.Format("{0},{1}",Title,Publisher)
}
C#6
public override ToString() => #"{Title} {Publisher}"
0.3.9 字典初始化器
字典现在可以用字典初始化器来初始化,类似于集合初始化器。
C#5
var dict = new Dictionary<int,string>();
dict.Add(3,"three");
dict.Add(7,"seven");
C#6
var dict = new Dictionary<int,string>()
{
[3] = "three",
[7] = "seven"
};
0.3.10 异常过滤器
异常过滤器允许在捕获异常之前过滤它们。
C#5
try
{
}
catch(MyException ex)
{
if(ex.ErrorCode != 405) throw;
}
C#6
try
{
}
catch(MyException ex) when (ex.ErrorCode == 405)
{
}
新语法的一大优势是,它不仅减少了代码的长度,而且没有改变堆栈跟踪----在C#5中会改变堆栈跟踪。
0.3.11 Catch中的await
C#5
bool hasError = false;
string errorMessage = null;
try
{
}
catch (System.Exception ex)
{
hasError = true;
errorMessage = ex.Message;
}
if (hasError)
{
await new MessageDialog().ShowAsync(errorMessage);
}
C#6
try
{
}
catch (System.Exception ex)
{
await new MessageDialog().ShowAsync(errorMessage);
}