C# 7.0 新增功能&结合微软简化理解

C# 7.0更新时间为2019.2左右

 

 C# 7.0 ~ 7.3 分别需要VS2017 与 .NET Core 1.0、 .NET Core 2.0 SDK、.NET Core 2.1 SDK,需要在2017下载器中,依照步骤添加:已安装——>修改——>安装详细信息——>.NET桌面开发——>.NET Core X开发工具(打钩)——>修改

一、 out 变量

                string str = "123";
                int result;
                int.TryParse(str, out  result);
                result += 1;
                Console.WriteLine("result + 1 =? {0}", result.ToString());

  1.1 out变量的声明,不再需单独声明。

                string str = "123";
                int.TryParse(str, out int result);
                result += 1;
                Console.WriteLine("result + 1 =? {0}", result.ToString());

二、 元组 ValueTuple(结构)

定义:包含多个数据元素的简单结构的方法

  1. 下载NET Framework 4.7.2以上版本内置功能,可不用独立下拓展包NuGet,低版本需在VS拓展下载此包。

            //NET Framework 4.7
            var ToString = "Text:";
            var one= 10;
            var Item1 = 20;
            var X= (ToString, one, Item1);
        
            Console.WriteLine(X.Item1);
            //Console.WriteLine(X.one); //NET Framework 4.8支持
            Console.WriteLine(X.Item2);
            Console.WriteLine(X.Item3);

            var pt1 = (X: 3, Y: 0);
            var pt2 = (X: 3, Y: 4);
            var xCoords = (pt1.X, pt2.X);

            Console.WriteLine(xCoords.Item1);
            Console.WriteLine(xCoords.Item2);
            Console.ReadKey();        

  2. 下载NET Framework 4.8以上版本

  2.1 新用法

var X = (A: "a", B: "b");

Console.WriteLine(X.A);

  2.2 或者未命名元素也可

var unnamed = ("one", "two");

  2.3 拆包,这里的打包是以(1,2)作为元组pt1的元素,再将(pt1,pt2)作为元组xCoords的元素,算是元组嵌套。

var xCoords = (pt1:(1,2), pt2: (3,4));//打包
Console.WriteLine(xCoords.pt1.Item1);
Console.WriteLine(xCoords.pt2.Item2);
Console.WriteLine(xCoords.pt1);
Console.WriteLine(xCoords.pt2);

(var po1, var po2) = xCoords;//元组解析(拆包)
Console.WriteLine(po1);
Console.WriteLine(po2);
Console.ReadKey();

三、弃元

定义:在进行元组解构或使用 out 参数调用方法时,必须定义一个其值无意义且不用的变量。C# 增添了对弃元的支持。

标识:_

var t1 = (w:1,2,3,4,5,6);
(_, var p2, _ , var p4, _, _) = t1;
Console.WriteLine(p2);
Console.WriteLine(p3);

四、匹配模式

is, when, null 对于if, switch case 等作变量匹配时,一些新的用法。

  is:查询变量定义的类型;

  when:作为case 的附加条件;

  null:作为空(null)条件时的选项。

            List<object> listA = new List<object>();
            listA.Add(1);
            listA.Add(2);
            listA.Add(3);           
            int sum = 0;
            foreach (var i in listA)
            {
                switch (i)
                {
                    case 0:
                        if (sum is int j)//检查变量是否为int,j为新定义该范围的局部变量
                        { sum += 10; }
                        break;
                    case int n when n > 0:
                        sum += n;
                        Console.WriteLine("sum ={0} ", sum);
                        break;
                    case null:
                        break;
                    default:
                        break;
                }
            }

五、一些兼容更改

原代码

public double Square(double value)
{
    return value * value;
}

新代码

public double Square(double value) => value * value;

源兼容的新代码

public double Square(in double value) => value * value;

六、ref 局部变量和返回结果

可以直接返回局部变量

        public static ref int Find(int[,] matrix)
        {
            return ref matrix[0, 0];
        }

也可以将返回值声明为 ref 并在矩阵中修改该值

ref var item = ref Find(matrix, (val) => val == 10);

七、(新语法)通用的异步返回类型

需要添加 NuGet 包 System.Threading.Tasks.Extensions 才能使用 ValueTask<TResult> 类型。此功能估计需要NET Framework 4.8以上版本才有。此增强功能对于库作者最有用,可避免在性能关键型代码中分配 Task

  async缓存结果,通过ValueTask异步返回。

        public async ValueTask<int> Func()
        {
            await Task.Delay(100);
            return 5;
        }

八、数字文本语法改进

  二进制0b前标,十进制不用标,均用_分隔,二进制四位分隔,十进制千位(三位)分隔。

public const int Sixteen =   0b0001_0000;
public const long BillionsAndBillions = 100_000_000_000;
public const double AvogadroConstant = 6.022_140_857_747_474e23; 
public const decimal GoldenRatio = 1.618_033_988_749_894_848_204_586_834_365_638_117_720_309_179M;

参考微软的公告,对其简化和自己实际验证之后的理解。

 

posted @ 2019-09-20 10:26  Lorzen  阅读(248)  评论(0编辑  收藏  举报