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;
参考微软的公告,对其简化和自己实际验证之后的理解。