C#7集成到 .NET Framework4.6.2和Visual Studio2017中,增加了元组和模式匹配,使得C#更具函数式语言特点
要使用C#7的语法特性,需要 .NET Framework4.6.2或以上版本。Visual Studio2017的各个不同版本都预装了4.6.2或4.7,不过默认是使用4.6.1建立新工程,需要选择4.6.2或以上版本建立新工程,才能使用C#7新语法
1.数字字面量
现在可以在数字中加下划线,增加数字的可读性。编译器或忽略所有数字中的下划线
int million = 1_000_000;
虽然编译器允许在数字中任意位置添加任意个数的下划线,但显然,遵循管理,下划线应该每三位使用一次,而且,不可以将下划线放在数字的开头(_1000)或结尾(1000_)
2.改进的out关键字
C#7支持了out关键字的即插即用
var a = 0;
int.TryParse("345", out a);
// 就地使用变量作为返回值
int.TryParse("345", int out b);
允许以_(下划线)形式“舍弃”某个out参数,方便你忽略不关系的参数。例如下面的例子中,获得一个二维坐标的X可以重用获得二维坐标的X,Y方法,并舍弃掉Y:
struct Point
{
public int x;
public int y;
private void GetCoordinates(out int x, out int y)
{
x = this.x;
y = this.y;
}
public void GetX()
{
// y被舍弃了,虽然GetCoordinates方法还是会传入2个变量,且执行y=this.y
// 但它会在返回之后丢失
GetCoordinates(out int x, out _);
WriteLine($"({x})");
}
}
3. 模式匹配
模式匹配(Pattern matching)是C#7中引入的重要概念,它是之前is和case关键字的扩展。目前,C#拥有三种模式:
- 常量模式:简单地判断某个变量是否等于一个常量(包括null)
- 类型模式:简单地判断某个变量是否为一个类型的实例
- 变量模式:临时引入一个新的某个类型的变量(C#7新增)
下面的例子简单地演示了这三种模式:
class People
{
public int TotalMoney {
get; set; }
public People(int a)
{
TotalMoney = a;
}
}
class Program
{
static void Main(string[] args)
{
var peopleList = new List<People>() {
new People(1),
new People(1_000_000)
};
foreach (var p in peopleList)
{
// 类型模式
if (p is People) WriteLine("是人");
// 常量模式
if (p.TotalMoney > 500_000) WriteLine("有钱");
// 变量模式
// 加入你需要先判断一个变量p是否为People,如果是,则再取它的TotalMoney字段
// 那么在之前的版本中必须要分开写
if (p is People)
{
var temp = (People)p;
if (temp.TotalMoney > 500_000) WriteLine("有钱");
}
// 变量模式允许你引入一个变量并立即使用它
if (p is People ppl && ppl.TotalMoney > 500_000) WriteLine("有钱");