栏目总目录
Tuple是C# 4.0引入的一个新特性,主要用于存储一个固定数量的元素序列,且这些元素可以具有不同的类型。Tuple是一种轻量级的数据结构,非常适合用于临时存储数据,而无需定义完整的类或结构体。
Item1
、Item2
等方式访问,缺乏语义化名称,导致代码可读性差,且难以维护。// 使用构造函数创建Tuple
var testTuple6 = new Tuple<int, int, int, int, int, int>(1, 2, 3, 4, 5, 6);
Console.WriteLine($"Item 1: {testTuple6.Item1}, Item 6: {testTuple6.Item6}");
// 使用Tuple的静态方法Create创建Tuple
var testTuple8 = Tuple.Create<int, int, int, int, int, int, int, int>(1, 2, 3, 4, 5, 6, 7, 8);
// 注意:当元素超过7个时,第八个元素实际上是一个新的Tuple
// 要访问第八个元素,需要这样:
Console.WriteLine($"Item 8: {testTuple8.Rest.Item1}");
// 创建一个表示学生信息的Tuple
var studentInfo = Tuple.Create<string, int, uint>("Bob", 28, 175);
Console.WriteLine($"Student Information: Name [{studentInfo.Item1}], Age [{studentInfo.Item2}], Height [{studentInfo.Item3}]");
ValueTuple
是值类型(struct),在栈上分配内存(局部使用时),或在堆上(作为对象成员时)。System.Tuple
不同,ValueTuple
的元素在创建后是可以修改的。ValueTuple
的语法简洁,直接使用(和)
包含多个值。ValueTuple
中直接提取值到变量中。ValueTuple
,避免了out
参数或专门类的使用。using System;
namespace ValueTupleDemo
{
class Program
{
// 定义一个返回ValueTuple的函数
static (string Name, int Age, uint Height) GetStudentInfo(string name)
{
return ("Bob", 28, 175u);
}
static void Main(string[] args)
{
// 使用新的返回语法调用函数
var (name, age, height) = GetStudentInfo("Bob");
// 传统的访问方式仍然有效
var studentInfo = GetStudentInfo("Bob");
Console.WriteLine($"Student Information: Name [{studentInfo.Name}], Age [{studentInfo.Age}], Height [{studentInfo.Height}]");
// 解构赋值到临时变量
(var tempName, var tempAge, var tempHeight) = GetStudentInfo("Bob");
Console.WriteLine($"Temporary Student Information: Name [{tempName}], Age [{tempAge}], Height [{tempHeight}]");
// 忽略不需要的元素
var (_, ageOnly, _) = GetStudentInfo("Bob");
Console.WriteLine($"Age Only: [{ageOnly}]");
// 嵌套ValueTuple
var complexTuple = (1, (2, 3), 4);
Console.WriteLine($"Complex Tuple: ({complexTuple.Item1}, ({complexTuple.Item2.Item1}, {complexTuple.Item2.Item2}), {complexTuple.Item3})");
// 使用C# 7.3及以上版本的命名特性(需编译器支持)
// 注意:这里仅为示例,实际编译器可能需要特定版本或配置来支持
static (string firstName, string lastName) GetName(string fullName)
{
var parts = fullName.Split(' ');
return (parts[0], parts[1]);
}
var (firstName, lastName) = GetName("John Doe");
Console.WriteLine($"First Name: {firstName}, Last Name: {lastName}");
}
}
}
注意:
var complexTuple = (1, (2, 3), 4);
)展示了如何通过嵌套来扩展元组的能力。static (string firstName, string lastName) GetName(string fullName)
)在C# 7.3及更高版本中可用,并需要编译器支持。这个特性允许你为ValueTuple的每个元素指定有意义的名称,而不仅仅是使用Item1
、Item2
等。var (name, age, height) = GetStudentInfo("Bob");
)提供了从ValueTuple中提取数据的便捷方式。Tuple提供了一种快速、简便的方式来创建包含多个元素的数据结构,但其缺点也不容忽视。在C# 7.0及更高版本中,ValueTuple作为Tuple的改进版,提供了更好的性能和更灵活的使用方式,是处理多个返回值或临时数据结构时的更好选择。