定义:
//此赋值会创建其成员为 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# 增添了对弃元的支持。 弃元是一个名为 _
(下划线字符)的只写变量,可向单个变量赋予要放弃的所有值。 弃元类似于未赋值的变量;不可在代码中使用弃元(赋值语句除外)。
在以下方案中支持弃元:
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
相关推荐
4. **Tuples**:C# 7.0引入了元组,提供了一种简单的方法来处理多个返回值,增强了代码的可读性。 5. **Nullable Reference Types**:这个特性增强了编译器的警告系统,以防止可能出现的空引用异常,提升了代码的...
本文将详细介绍C#7.0中的几项关键特性,包括元组、模式匹配、输出变量等。 #### 二、输出变量 输出变量是C#7.0中新增的一项特性,它简化了输出参数的使用方式。在之前的版本中,使用输出参数需要先声明一个变量并将...
C#7.0新增了诸多功能,其中有一项是新元组(ValueTuple),它允许我们可以返回多个值,并且配合解构能更加方便的进行工作,如下面例子 static void Main(string[] args) { (var name, var age) = GetUser(); ...
元组是C# 7.0中另一个显著的新增功能,它使得多值返回成为可能,无需创建复杂的类结构。元组可以方便地表示一组相关但无固定名称的数据,如`(int x, string y)`。元组成员可以通过位置访问,也可以通过可选的成员...
在C#7.0中,引入了元组、out变量、模式匹配等。C#8.0和9.0进一步增强了这些特性,并引入了可为空引用类型、默认接口实现等。C#10.0的预览版5中,我们看到了记录类型、顶级语句等新功能的加入。这些新特性使得C#程序...
在文档的最后,介绍了C#中的新增功能,包括C#8.0、C#7.3、C#7.2、C#7.1、C#7.0等版本的历史更新。每个新版本都带来了新特性,这些更新逐渐将C#推向了一个更加现代、功能强大的编程语言。 对于希望深入学习C#的...
此外,文档还包含了关于C#其他版本(如C#8.0和C#7.0-7.3)的介绍和重大更改的对比,使得学习者可以了解到各个版本之间的差异。 在C#类型系统方面,文档详细探讨了命名空间、基本类型、类、接口、方法、属性、索引器...
- **C#中的新增功能**:概括了从C# 9.0到C# 7.0的各个版本中新添加的重要特性。 #### 七、编译器与版本 - **编译器中的重大更改**:概述了C#编译器的重大更新,包括性能改进、新功能等。 - **C#版本历史记录**:...
关于C#的新增功能,文档会提到C# 8.0、7.3、7.2、7.1、7.0、6等各个版本中引入的新特性。其中C# 8.0可能会包括可为空引用类型(Nullable Reference Types),它帮助开发者更早地发现空引用异常的潜在问题。C#版本...
此外,文档还讨论了C#的版本更新,包括C# 9.0、8.0以及7.0到7.3的新增特性。每次版本更新都会引入新的语言特性和改进,开发者可以根据需要逐步升级自己的项目。 代码互操作性部分介绍了如何在C#中调用非托管代码和...
自C# 7.0起,还可以使用元组(tuple)进行匹配。 - case后的常量表达式必须是编译时常量,并且每个case表达式的值必须是唯一的,不能重复。 - case后面可以跟随多条语句,这些语句会被顺序执行直到遇到break语句。 -...