详解C# Tuple VS ValueTuple(元组类 VS 值元组)
2021-02-06 08:17
标签:研究 format stat art 原创文章 学习 对象 函数定义 序列
C# 7.0已经出来一段时间了,大家都知道新特性里面有个对元组的优化:ValueTuple。这里利用详尽的例子详解Tuple VS ValueTuple(元组类VS值元组),10分钟让你更了解ValueTuple的好处和用法。 如果您对Tuple足够了解,可以直接跳过章节”回顾Tuple”,直达章节”ValueTuple详解”,查看值元组的炫丽用法。 Tuple是C# 4.0时出的新特性,.Net Framework 4.0以上版本可用。 元组是一种数据结构,具有特定数量和元素序列。比如设计一个三元组数据结构用于存储学生信息,一共包含三个元素,第一个是名字,第二个是年龄,第三个是身高。 元组的具体使用如下: 默认情况.Net Framework元组仅支持1到7个元组元素,如果有8个元素或者更多,需要使用Tuple的嵌套和Rest属性去实现。另外Tuple类提供创造元组对象的静态方法。 Note:这里构建出来的Tuple类型其实是Tuple 如下创建一个元组表示一个学生的三个信息:名字、年龄和身高,而不用单独额外创建一个类。 当一个函数需要返回多个值的时候,一般情况下可以使用out参数,这里可以用元组代替out实现返回多个值。 4. 用于单参数方法的多值传递 当函数参数仅是一个Object类型时,可以使用元组实现传递多个参数值。 尽管元组有上述方便使用的方法,但是它也有明显的不足: 因此在C# 7.0中引入了一个新的ValueTuple类型,详见下面章节。 ValueTuple是C# 7.0的新特性之一,.Net Framework 4.7以上版本可用。 值元组也是一种数据结构,用于表示特定数量和元素序列,但是是和元组类不一样的,主要区别如下: 值元组的具体使用如下: 和元组类一样,.Net Framework值元组也只支持1到7个元组元素,如果有8个元素或者更多,需要使用值元组的嵌套和Rest属性去实现。另外ValueTuple类可以提供创造值元组对象的静态方法。 注意这里构建出来的Tuple类型其实是Tuple 优化区别:当构造出超过7个元素以上的值元组后,可以使用接下来的ItemX进行访问嵌套元组中的值,对于上面的例子,要访问第十个元素,既可以通过testTuple10.Rest.Item3访问,也可以通过testTuple10.Item10来访问。 如下创建一个值元组表示一个学生的三个信息:名字、年龄和身高,而不用单独额外创建一个类。 值元组也可以在函数定义中代替out参数返回多个值。 优化区别:返回值可以不明显指定ValueTuple,使用新语法(,,)代替,如(string, int, uint): 调试查看studentInfo的类型就是ValueType三元组。 优化区别:返回值可以指定元素名字,方便理解记忆赋值和访问: 方便记忆赋值: 方便访问: 当函数参数仅是一个Object类型时,可以使用值元组实现传递多个值。 可以通过var (x, y)或者(var x, var y)来解析值元组元素构造局部变量,同时可以使用符号”_”来忽略不需要的元素。 由上所述,ValueTuple使C#变得更简单易用。较Tuple相比主要好处如下: [原创文章,转载请注明出处,仅供学习研究之用,如有错误请留言,如觉得不错请推荐,谢谢支持] [原文:http://www.cnblogs.com/lavender000/p/6916157.html,来自永远薰薰] 详解C# Tuple VS ValueTuple(元组类 VS 值元组) 标签:研究 format stat art 原创文章 学习 对象 函数定义 序列 原文地址:https://www.cnblogs.com/lonelyxmas/p/11422458.html回顾Tuple
1. 如何创建元组
var testTuple6 = new Tupleint, int, int, int, int, int>(1, 2, 3, 4, 5, 6);
Console.WriteLine($"Item 1: {testTuple6.Item1}, Item 6: {testTuple6.Item6}");
var testTuple10 = new Tupleint, int, int, int, int, int, int, Tupleint, int, int>>(1, 2, 3, 4, 5, 6, 7, new Tupleint, int, int>(8, 9, 10));
Console.WriteLine($"Item 1: {testTuple10.Item1}, Item 10: {testTuple10.Rest.Item3}");
var testTuple6 = Tuple.Createint, int, int, int, int, int>(1, 2, 3, 4, 5, 6);
Console.WriteLine($"Item 1: {testTuple6.Item1}, Item 6: {testTuple6.Item6}");
var testTuple8 = Tuple.Createint, int, int, int, int, int, int, int>(1, 2, 3, 4, 5, 6, 7, 8);
Console.WriteLine($"Item 1: {testTuple8.Item1}, Item 8: {testTuple8.Rest.Item1}");
2. 表示一组数据
var studentInfo = Tuple.Createstring, int, uint>("Bob", 28, 175);
Console.WriteLine($"Student Information: Name [{studentInfo.Item1}], Age [{studentInfo.Item2}], Height [{studentInfo.Item3}]");
3. 从方法返回多个值
static Tuplestring, int, uint> GetStudentInfo(string name)
{
return new Tuplestring, int, uint>("Bob", 28, 175);
}
static void RunTest()
{
var studentInfo = GetStudentInfo("Bob");
Console.WriteLine($"Student Information: Name [{studentInfo.Item1}], Age [{studentInfo.Item2}], Height [{studentInfo.Item3}]");
}static void WriteStudentInfo(Object student)
{
var studentInfo = student as Tuplestring, int, uint>;
Console.WriteLine($"Student Information: Name [{studentInfo.Item1}], Age [{studentInfo.Item2}], Height [{studentInfo.Item3}]");
}
static void RunTest()
{
var t = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(WriteStudentInfo));
t.Start(new Tuplestring, int, uint>("Bob", 28, 175));
while (t.IsAlive)
{
System.Threading.Thread.Sleep(50);
}
}
ValueTuple详解
1. 如何创建值元组
var testTuple6 = new ValueTupleint, int, int, int, int, int>(1, 2, 3, 4, 5, 6);
Console.WriteLine($"Item 1: {testTuple6.Item1}, Item 6: {testTuple6.Item6}");
var testTuple10 = new ValueTupleint, int, int, int, int, int, int, ValueTupleint, int, int>>(1, 2, 3, 4, 5, 6, 7, new ValueTuple int, int, int>(8, 9, 10));
Console.WriteLine($"Item 1: {testTuple10.Item1}, Item 10: {testTuple10.Rest.Item3}");
var testTuple6 = ValueTuple.Createint, int, int, int, int, int>(1, 2, 3, 4, 5, 6);
Console.WriteLine($"Item 1: {testTuple6.Item1}, Item 6: {testTuple6.Item6}");
var testTuple8 = ValueTuple.Createint, int, int, int, int, int, int, int>(1, 2, 3, 4, 5, 6, 7, 8);
Console.WriteLine($"Item 1: {testTuple8.Item1}, Item 8: {testTuple8.Rest.Item1}");
var testTuple10 = new ValueTupleint, int, int, int, int, int, int, ValueTupleint, int, int>>(1, 2, 3, 4, 5, 6, 7, new ValueTupleint, int, int>(8, 9, 10));
Console.WriteLine($"Item 10: {testTuple10.Rest.Item3}, Item 10: {testTuple10.Item10}");
2. 表示一组数据
var studentInfo = ValueTuple.Createstring, int, uint>("Bob", 28, 175);
Console.WriteLine($"Student Information: Name [{studentInfo.Item1}], Age [{studentInfo.Item2}], Height [{studentInfo.Item3}]");
3. 从方法返回多个值
static ValueTuplestring, int, uint> GetStudentInfo(string name)
{
return new ValueTuple string, int, uint>("Bob", 28, 175);
}
static void RunTest()
{
var studentInfo = GetStudentInfo("Bob");
Console.WriteLine($"Student Information: Name [{studentInfo.Item1}], Age [{studentInfo.Item2}], Height [{studentInfo.Item3}]");
}static (string, int, uint) GetStudentInfo1(string name)
{
return ("Bob", 28, 175);
}
static void RunTest1()
{
var studentInfo = GetStudentInfo1("Bob");
Console.WriteLine($"Student Information: Name [{studentInfo.Item1}], Age [{studentInfo.Item2}], Height [{studentInfo.Item3}]");
}static (string name, int age, uint height) GetStudentInfo1(string name)
{
return ("Bob", 28, 175);
}
static void RunTest1()
{
var studentInfo = GetStudentInfo1("Bob");
Console.WriteLine($"Student Information: Name [{studentInfo.name}], Age [{studentInfo.age}], Height [{studentInfo.height}]");
}4. 用于单参数方法的多值传递
static void WriteStudentInfo(Object student)
{
var studentInfo = (ValueTuplestring, int, uint>)student;
Console.WriteLine($"Student Information: Name [{studentInfo.Item1}], Age [{studentInfo.Item2}], Height [{studentInfo.Item3}]");
}
static void RunTest()
{
var t = new System.Threading.Thread(new System.Threading.ParameterizedThreadStart(WriteStudentInfo));
t.Start(new ValueTuplestring, int, uint>("Bob", 28, 175));
while (t.IsAlive)
{
System.Threading.Thread.Sleep(50);
}
}5. 解构ValueTuple
static (string name, int age, uint height) GetStudentInfo1(string name)
{
return ("Bob", 28, 175);
}
static void RunTest1()
{
var (name, age, height) = GetStudentInfo1("Bob");
Console.WriteLine($"Student Information: Name [{name}], Age [{age}], Height [{height}]");
(var name1, var age1, var height1) = GetStudentInfo1("Bob");
Console.WriteLine($"Student Information: Name [{name1}], Age [{age1}], Height [{height1}]");
var (_, age2, _) = GetStudentInfo1("Bob");
Console.WriteLine($"Student Information: Age [{age2}]");
}
文章标题:详解C# Tuple VS ValueTuple(元组类 VS 值元组)
文章链接:http://soscw.com/index.php/essay/51668.html