C# 6新特性简单总结

时间:2021-05-20 16:16:51

最近在看《C#高级编程 C# 6&.NET Core 1.0》,会做一些读书笔记,也算对知识的总结与沉淀了。

1.静态的using声明

静态的using声明允许调用静态方法时不使用类名:

 // C# 5
using System; Console.WriteLine("C# 5"); // C# 6
using static System.Console; WriteLine("C# 6");

2.表达式体方法

表达式体方法只包含一个可以用Lambda语法编写的语句:

 // C# 5
public bool IsSquare(Rectangle rect)
{
return rect.Width == rect.Height;
} // C# 6
public bool IsSquare(Rectangle rect) => rect.Width == rect.Height;

3.表达式体属性

与表达式体方法类似,只有get存储器的单行属性可以用Lambda语法编写:

 // C# 5
public string FullName
{
get
{
return FirstName + " " + LastName;
}
} // C# 6
public string FullName => FirstName + " " + LastName;

4.自动实现的属性初始化器

自动实现的属性可以用属性初始化器来初始化:

 // C# 5
public class Person
{
public Person()
{
Age = ;
}
public int Age { get; set; }
} // C# 6
public class Person
{
public int Age { get; set; } = ;
}

5.只读的自动属性

 // C# 5
private readonly int _bookId;
public BookId
{
get
{
return _bookId;
}
} // C# 6
private readonly int _bookId;
public BookId { get; }

6.nameof运算符

使用新的nameof运算符,可以访问字段名、属性名、方法名和类型名。这样,在重构时就不会遗漏名称的改变:

 // C# 5
public void Method(object o)
{
if(o == null)
{
throw new ArgumentNullException("o");
}
} // C# 6
public void Method(object o)
{
if(o == null)
{
throw new ArgumentNullException(nameof(o));
}
}

7.空值传播运算符

空值传播运算符简化了空值的检查:

 // C# 5
int? age = p == null ? null : p.Age; // C# 6
int? age = p?.Age;

8.字符串插值

字符串插值删除了对string.Format的调用,它不在字符串中使用编号的格式占位符,占位符可以包含表达式:

 // C# 5
public override string ToString()
{
return string.Format("{0},{1}", Title, Publisher);
} // C# 6
public override string ToString() => $"{Title}{Publisher}";

9.字典初始化

 // C# 5
var dic = new Dictionary<int, string>();
dic.Add(, "three");
dic.Add(, "seven"); // C# 6
var dic = new Dictionary<int, string>()
{
[] = "three",
[] = "seven"
};

10.异常过滤器

异常过滤器允许在捕获异常之前过滤它们:

 // C# 5
try
{
//
}
catch (MyException ex)
{
if (ex.ErrorCode != ) throw;
} // C# 6
try
{
//
}
catch (MyException ex) when (ex.ErrorCode == )
{
//
}

11.catch中的await

await现在可以在catch子句中使用,C# 5需要一种变通方法:

 // C# 5
bool hasError = false;
string errorMsg = null;
try
{
//
}
catch (MyException ex)
{
hasError = true;
errorMsg = ex.Message;
}
if (hasError)
{
await new MessageDialog().ShowAsync(errorMsg);
} // C# 6
try
{
//
}
catch (MyException ex)
{
await new MessageDialog().ShowAsync(ex.Message);
}