C#

C#7.0新特性(VS2017可用)

C#7.0新特性

Posted by JP on March 9, 2018

使用 vs2017 体验c#7.0新特性

前言

其实2016年12月就已经公布的C#7.0新特性了,但笔者的IDE一直用的VS2015,正巧前段时间升级到2017,下面总结一下。
官方介绍地址:What’s new in C# 7,中文版C# 7 中的新增功能

先列一下相关语法:

正文

1.out-variables (输出变量)

C#7.0之前,使用out参数可能不像我们想的那样方便。在你调用一个带有out参数的方法之前,你必须首先声明一个变量并传递给它。你通常不会初始化这些变量(毕竟它们会被方法重写),也不能用var去声明他们,而是必须指定数据的完整类型。

	public void PrintCoordinates(Point p)
    {
        int x, y;//必须预定义
        p.GetCoordinates(out x, out y);
        WriteLine($"({x},{y})");
    }

在c#7.0中,我们添加了out变量,可以在给一个函数传入参数的时候再去定义变量。

	public void PrintCoordinates(Point p)
    {            
        p.GetCoordinates(out int x, out int y);
        WriteLine($"({x},{y})");
    }

由于out变量会直接被当做out参数来声明,因此编译器通常可以知道它们应该是什么类型(除非它们被重载),所以我们可以使用var来定义,而不必使用真正的类型。

 	p.GetCoordinates(out var x, out var y);

2.Tuples (元组)

在.NET4.0中,微软对多个返回值给了我们一个解决方案叫元组,类似代码如下:

	static void Main(string[] args)
 		{
        var data = GetFullName();
        Console.WriteLine(data.Item1);
        Console.WriteLine(data.Item2);
        Console.WriteLine(data.Item3);
        Console.ReadLine();
	}
	static Tuple<string, string, string> GetFullName() 
	{
       return  new Tuple<string, string, string>("a", "b", "c");
	}

上面代码展示了一个方法,返回含有3个字符串的元组,然而当我们获取到值,使用的时候 心已经炸了,Item1,Item2,Item3是什么鬼,虽然达到了我们的要求,但是实在不优雅。而在C#7.0中,微软提供了更优雅的方案:(注意:需要通过nuget引用System.ValueTuple)如下:

	static void Main(string[] args)
    {
        var data=GetFullName();
        Console.WriteLine(data.a); //可用命名获取到值
        Console.WriteLine(data.b);
        Console.WriteLine(data.c);
        Console.ReadLine();

    }
    //方法定义为多个返回值,并命名
    private static (string a,string b,string c) GetFullName()
    {
        return ("a","b","c");
    }

解构元组,有的时候我们不想用var匿名来获取,那么如何获取abc呢?我们可以如下:

	static void Main(string[] args)
    {
       //定义解构元组
        (string a, string b, string c) = GetFullName();

        Console.WriteLine(a);
        Console.WriteLine(b);
        Console.WriteLine(c);
        Console.ReadLine();

    }
    private static (string a,string b,string c) GetFullName()
    {
        return ("a","b","c");
    }

3.Discards (丢元)

参考文档:

  1. C# 7.0 新功能,原文地址What’s New in C# 7.0
  2. 干货来袭.C#7.0新特性(VS2017可用)
  3. 开源翻译
  4. 欢迎使用.NET