`
wyf
  • 浏览: 437941 次
  • 性别: Icon_minigender_1
  • 来自: 唐山
社区版块
存档分类
最新评论

C#7.0新增元组

    博客分类:
  • C#
阅读更多

定义:

//此赋值会创建其成员为 Item1 和 Item2 的元组,其使用方式与 Tuple 的相同。
var letters = ("a", "b");

//namedLetters 元组包含称为 Alpha 和 Beta 的字段。
(string Alpha, string Beta) namedLetters = ("a", "b");

//还可以指定赋值右侧的字段的名称
var alphabetStart = (Alpha: "a", Beta: "b");

//生成警告 CS8123,告知你赋值右侧的名称 Alpha 和 Beta 将被忽略,
//因为它们与左侧的名称 First 和 Second 冲突。
(string First, string Second) firstLetters = (Alpha: "a", Beta: "b");

 使用

元组在作为 private 和 internal 方法的返回类型时是最有用的。 元组为这些方法提供了简单的语法以返回多个离散值:不用再费心创作定义返回类型的 class 或 struct 无需创建新类型。

public static double StandardDeviation(IEnumerable<double> sequence)
{
    (int Count, double Sum, double SumOfSquares) computation = ComputeSumsAnSumOfSquares(sequence);

    var variance = computation.SumOfSquares - computation.Sum * computation.Sum / computation.Count;
    return Math.Sqrt(variance / computation.Count);
}

private static (int Count, double Sum, double SumOfSquares) ComputeSumsAnSumOfSquares(IEnumerable<double> sequence)
{
    var computation = (count: 0, sum: 0.0, sumOfSquares: 0.0);

    foreach (var item in sequence)
    {
        computation.count++;
        computation.sum += item;
        computation.sumOfSquares += item * item;
    }

    return computation;
}

 

析构

//1
 (int count, double sum, double sumOfSquares) = ComputeSumAndSumOfSquares(sequence);
//2
var (sum, sumOfSquares, count) = ComputeSumAndSumOfSquares(sequence);
//3
(double sum, var sumOfSquares, var count) = ComputeSumAndSumOfSquares(sequence);
//4析构赋值
public class Point
{
    public int X { get; set; }
    public int Y { get; set; }

    public Point(int x, int y) => (X, Y) = (x, y);
}

 

析构用户定义类型

定义一个Deconstruct函数,参数加out

public class Point
{
    public Point(double x, double y)
    {
        this.X = x;
        this.Y = y;
    }

    public double X { get; }
    public double Y { get; }

    public void Deconstruct(out double x, out double y)
    {
        x = this.X;
        y = this.Y;
    }
}

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

 

弃元

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

在以下方案中支持弃元:

 

  • 在对元组或用户定义的类型进行解构时。

  • 在使用 out 参数调用方法时。

  • 在使用 is 和 switch 语句匹配操作的模式中。

  • 在要将某赋值的值显式标识为弃元时用作独立标识符。

using System;
using System.Collections.Generic;

public class Example
{
   public static void Main()
   {
       var (_, _, _, pop1, _, pop2) = QueryCityDataForYears("New York City", 1960, 2010);

       Console.WriteLine($"Population change, 1960 to 2010: {pop2 - pop1:N0}");
   }
   
   private static (string, double, int, int, int, int) QueryCityDataForYears(string name, int year1, int year2)
   {
      int population1 = 0, population2 = 0;
      double area = 0;
      
      if (name == "New York City") {
         area = 468.48; 
         if (year1 == 1960) {
            population1 = 7781984;
         }
         if (year2 == 2010) {
            population2 = 8175133;
         }
      return (name, area, year1, population1, year2, population2);
      }

      return ("", 0, 0, 0, 0, 0);
   }
}
// The example displays the following output:
//      Population change, 1960 to 2010: 393,149

 

分享到:
评论

相关推荐

    Essential C# 7.0 Sixth Edition

    4. **Tuples**:C# 7.0引入了元组,提供了一种简单的方法来处理多个返回值,增强了代码的可读性。 5. **Nullable Reference Types**:这个特性增强了编译器的警告系统,以防止可能出现的空引用异常,提升了代码的...

    C#7.0的新特性

    本文将详细介绍C#7.0中的几项关键特性,包括元组、模式匹配、输出变量等。 #### 二、输出变量 输出变量是C#7.0中新增的一项特性,它简化了输出参数的使用方式。在之前的版本中,使用输出参数需要先声明一个变量并将...

    C# 7.0中解构功能详解

     C#7.0新增了诸多功能,其中有一项是新元组(ValueTuple),它允许我们可以返回多个值,并且配合解构能更加方便的进行工作,如下面例子 static void Main(string[] args) { (var name, var age) = GetUser(); ...

    C#7.0中新特性汇总

    元组是C# 7.0中另一个显著的新增功能,它使得多值返回成为可能,无需创建复杂的类结构。元组可以方便地表示一组相关但无固定名称的数据,如`(int x, string y)`。元组成员可以通过位置访问,也可以通过可选的成员...

    C#学习(微软原版2021).pdf

    在C#7.0中,引入了元组、out变量、模式匹配等。C#8.0和9.0进一步增强了这些特性,并引入了可为空引用类型、默认接口实现等。C#10.0的预览版5中,我们看到了记录类型、顶级语句等新功能的加入。这些新特性使得C#程序...

    C# 官方入门指南.pdf

    在文档的最后,介绍了C#中的新增功能,包括C#8.0、C#7.3、C#7.2、C#7.1、C#7.0等版本的历史更新。每个新版本都带来了新特性,这些更新逐渐将C#推向了一个更加现代、功能强大的编程语言。 对于希望深入学习C#的...

    C#9 编程指南.pdf

    此外,文档还包含了关于C#其他版本(如C#8.0和C#7.0-7.3)的介绍和重大更改的对比,使得学习者可以了解到各个版本之间的差异。 在C#类型系统方面,文档详细探讨了命名空间、基本类型、类、接口、方法、属性、索引器...

    MSDN离线版C# 脚本手册 C# 指南.pdf

    - **C#中的新增功能**:概括了从C# 9.0到C# 7.0的各个版本中新添加的重要特性。 #### 七、编译器与版本 - **编译器中的重大更改**:概述了C#编译器的重大更新,包括性能改进、新功能等。 - **C#版本历史记录**:...

    c#使用说明.pdf

    关于C#的新增功能,文档会提到C# 8.0、7.3、7.2、7.1、7.0、6等各个版本中引入的新特性。其中C# 8.0可能会包括可为空引用类型(Nullable Reference Types),它帮助开发者更早地发现空引用异常的潜在问题。C#版本...

    MSDN C#指南.pdf

    此外,文档还讨论了C#的版本更新,包括C# 9.0、8.0以及7.0到7.3的新增特性。每次版本更新都会引入新的语言特性和改进,开发者可以根据需要逐步升级自己的项目。 代码互操作性部分介绍了如何在C#中调用非托管代码和...

    C#中的switch case使用介绍

    自C# 7.0起,还可以使用元组(tuple)进行匹配。 - case后的常量表达式必须是编译时常量,并且每个case表达式的值必须是唯一的,不能重复。 - case后面可以跟随多条语句,这些语句会被顺序执行直到遇到break语句。 -...

Global site tag (gtag.js) - Google Analytics