加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#7.0 新增功能

发布时间:2020-12-16 07:19:06 所属栏目:百科 来源:网络整理
导读:连载目录????【已更新最新开发文章,点击查看详细】 C# 7.0 向 C# 语言添加了许多新功能 01 out 变量 支持? out ?参数的现有语法已在此版本中得到改进。? 现在可以在方法调用的参数列表中声明? out ?变量,而不是编写单独的声明语句: if ( int .TryParse(in
连载目录????【已更新最新开发文章,点击查看详细】

C# 7.0 向 C# 语言添加了许多新功能

01 out 变量
支持?out?参数的现有语法已在此版本中得到改进。?现在可以在方法调用的参数列表中声明?out?变量,而不是编写单独的声明语句:
if (int.TryParse(input,out int result))
    Console.WriteLine(result);
else
    Console.WriteLine("Could not parse input");
为清晰明了,可能需指定?out?变量的类型,如上所示。?但是,该语言支持使用隐式类型的局部变量:
if (int.TryParse(input,out var answer))
    Console.WriteLine(answer);
else
    Console.WriteLine("Could not parse input");
  • 代码更易于阅读。
    • 在使用 out 变量的地方声明 out 变量,而不是在上面的另一行。
  • 无需分配初始值。
    • 通过在方法调用中使用?out?变量的位置声明该变量,使得在分配它之前不可能意外使用它。
02 元组
C# 为用于说明设计意图的类和结构提供了丰富的语法。?但是,这种丰富的语法有时会需要额外的工作,但益处却很少。?你可能经常编写需要包含多个数据元素的简单结构的方法。为了支持这些方案,已将元组 添加到了 C#。?元组是包含多个字段以表示数据成员的轻量级数据结构。?这些字段没有经过验证,并且你无法定义自己的方法

低于 C# 7.0 的版本中也提供元组,但它们效率低下且不具有语言支持。 这意味着元组元素只能作为 Item1 和 Item2 等引用。 C# 7.0 引入了对元组的语言支持,可利用更有效的新元组类型向元组字段赋予语义名称。

可以通过为每个成员赋值来创建元组,并可选择为元组的每个成员提供语义名称:
(string Alpha,string Beta) namedLetters = ("a","b");
Console.WriteLine($"{namedLetters.Alpha},{namedLetters.Beta}");

namedLetters?元组包含称为?Alpha?和?Beta?的字段。?这些名称仅存在于编译时且不保留,例如在运行时使用反射来检查元组时。

在进行元组赋值时,还可以指定赋值右侧的字段的名称:

var alphabetStart = (Alpha: "a",Beta: "b");
Console.WriteLine($"{alphabetStart.Alpha},{alphabetStart.Beta}");

在某些时候,你可能想要解包从方法返回的元组的成员。?可通过为元组中的每个值声明单独的变量来实现此目的。?这种解包操作称为解构元组

(int max,int min) = Range(numbers);
Console.WriteLine(max);
Console.WriteLine(min);

还可以为 .NET 中的任何类型提供类似的析构。?编写?Deconstruct?方法,用作类的成员。Deconstruct?方法为你要提取的每个属性提供一组?out?参数。?考虑提供析构函数方法的此?Point?类,该方法提取?X?和?Y?坐标:

public class Point
   {
       public double X { get; }
       public double Y { get; }
       
       public Point(double x,double y) => (X,Y) = (x,y);

       public void Deconstruct(out double x,out double y) => (x,y) = (X,Y);
   }

可以通过向元组分配?Point?来提取各个字段:

var p = new Point(3.14,2.71);
(
double X,double Y) = p;

可在元组相关文章中深入了解有关元组的详细信息。

03 弃元

通常,在进行元组解构或使用?out?参数调用方法时,必须定义一个其值无关紧要且你不打算使用的变量。?为处理此情况,C# 增添了对弃元的支持 。?弃元是一个名为?_(下划线字符)的只写变量,可向单个变量赋予要放弃的所有值。?弃元类似于未赋值的变量;不可在代码中使用弃元(赋值语句除外)。

在以下方案中支持弃元:

  • 在对元组或用户定义的类型进行解构时。
  • 在使用?out?参数调用方法时。
  • 在使用?is?和?switch?语句匹配操作的模式中。
  • 在要将某赋值的值显式标识为弃元时用作独立标识符。

以下示例定义了?QueryCityDataForYears?方法,它返回一个包含两个不同年份的城市数据的六元组。?本例中,方法调用仅与此方法返回的两个人口值相关,因此在进行元组解构时,将元组中的其余值视为弃元。

 1 using System;
 2 using System.Collections.Generic;
 3 
 4 public class Example
 5 {
 6    public static void Main()
 7    {
 8        var (_,_,pop1,pop2) = QueryCityDataForYears("New York City",1960,2010);
 9 
10        Console.WriteLine($"Population change,1960 to 2010: {pop2 - pop1:N0}");
11    }
12    
13    private static (string,double,int,int) QueryCityDataForYears(string name,int year1,int year2)
14    {
15       int population1 = 0,population2 = 0;
16       double area = 0;
17       
18       if (name == "New York City") {
19          area = 468.48; 
20          if (year1 == 1960) {
21             population1 = 7781984;
22          }
23          if (year2 == 2010) {
24             population2 = 8175133;
25          }
26       return (name,area,year1,population1,year2,population2);
27       }
28 
29       return ("",0,0);
30    }
31 }
32 //  输出结果:
33 //  Population change,1960 to 2010: 393,149

有关详细信息,请参阅弃元。

04 模式匹配
05 Ref 局部变量和返回结果
06 本地函数
07 更多的 expression-bodied 成员
08 引发表达式
09 通用的异步返回类型
10 数字文本语法改进
连载目录????【已更新最新开发文章,点击查看详细】

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读