时间:2021-05-19
C# 7.0已经出来一段时间了,大家都知道新特性里面有个对元组的优化:ValueTuple。这里利用详尽的例子详解Tuple VS ValueTuple(元组类VS值元组),10分钟让你更了解ValueTuple的好处和用法。
如果您对Tuple足够了解,可以直接跳过章节”回顾Tuple”,直达章节”ValueTuple详解”,查看值元组的炫丽用法。
回顾Tuple
Tuple是C# 4.0时出的新特性,.Net Framework 4.0以上版本可用。
元组是一种数据结构,具有特定数量和元素序列。比如设计一个三元组数据结构用于存储学生信息,一共包含三个元素,第一个是名字,第二个是年龄,第三个是身高。
元组的具体使用如下:
1. 如何创建元组
默认情况.Net Framework元组仅支持1到7个元组元素,如果有8个元素或者更多,需要使用Tuple的嵌套和Rest属性去实现。另外Tuple类提供创造元组对象的静态方法。
利用构造函数创建元组:
利用Tuple静态方法构建元组,最多支持八个元素:
Note:这里构建出来的Tuple类型其实是Tuple<int, int, int, int, int, int, int, Tuple<int>>,因此testTuple8.Rest取到的数据类型是Tuple<int>,因此要想获取准确值需要取Item1属性。
2. 表示一组数据
如下创建一个元组表示一个学生的三个信息:名字、年龄和身高,而不用单独额外创建一个类。
var studentInfo = Tuple.Create<string, int, uint>("Bob", 28, 175);Console.WriteLine($"Student Information: Name [{studentInfo.Item1}], Age [{studentInfo.Item2}], Height [{studentInfo.Item3}]");3. 从方法返回多个值
当一个函数需要返回多个值的时候,一般情况下可以使用out参数,这里可以用元组代替out实现返回多个值。
static Tuple<string, int, uint> GetStudentInfo(string name){ return new Tuple<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}]");}4. 用于单参数方法的多值传递
当函数参数仅是一个Object类型时,可以使用元组实现传递多个参数值。
static void WriteStudentInfo(Object student){ var studentInfo = student as Tuple<string, 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 Tuple<string, int, uint>("Bob", 28, 175)); while (t.IsAlive) { System.Threading.Thread.Sleep(50); }}尽管元组有上述方便使用的方法,但是它也有明显的不足:
因此在C# 7.0中引入了一个新的ValueTuple类型,详见下面章节。
ValueTuple详解
ValueTuple是C# 7.0的新特性之一,.Net Framework 4.7以上版本可用。
值元组也是一种数据结构,用于表示特定数量和元素序列,但是是和元组类不一样的,主要区别如下:
值元组的具体使用如下:
1. 如何创建值元组
和元组类一样,.Net Framework值元组也只支持1到7个元组元素,如果有8个元素或者更多,需要使用值元组的嵌套和Rest属性去实现。另外ValueTuple类可以提供创造值元组对象的静态方法。
利用构造函数创建元组:
利用Tuple静态方法构建元组,最多支持八个元素:
注意这里构建出来的Tuple类型其实是Tuple<int, int, int, int, int, int, int, Tuple<int>>,因此testTuple8.Rest取到的数据类型是Tuple<int>,因此要想获取准确值需要取Item1属性。
优化区别:当构造出超过7个元素以上的值元组后,可以使用接下来的ItemX进行访问嵌套元组中的值,对于上面的例子,要访问第十个元素,既可以通过testTuple10.Rest.Item3访问,也可以通过testTuple10.Item10来访问。
var testTuple10 = new ValueTuple<int, int, int, int, int, int, int, ValueTuple<int, int, int>>(1, 2, 3, 4, 5, 6, 7, new ValueTuple<int, int, int>(8, 9, 10));Console.WriteLine($"Item 10: {testTuple10.Rest.Item3}, Item 10: {testTuple10.Item10}");2. 表示一组数据
如下创建一个值元组表示一个学生的三个信息:名字、年龄和身高,而不用单独额外创建一个类。
var studentInfo = ValueTuple.Create<string, int, uint>("Bob", 28, 175);Console.WriteLine($"Student Information: Name [{studentInfo.Item1}], Age [{studentInfo.Item2}], Height [{studentInfo.Item3}]");3. 从方法返回多个值
值元组也可以在函数定义中代替out参数返回多个值。
static ValueTuple<string, 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}]");}优化区别:返回值可以不明显指定ValueTuple,使用新语法(,,)代替,如(string, int, uint):
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}]");}调试查看studentInfo的类型就是ValueType三元组。
优化区别:返回值可以指定元素名字,方便理解记忆赋值和访问:
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. 用于单参数方法的多值传递
当函数参数仅是一个Object类型时,可以使用值元组实现传递多个值。
static void WriteStudentInfo(Object student){ var studentInfo = (ValueTuple<string, 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 ValueTuple<string, int, uint>("Bob", 28, 175)); while (t.IsAlive) { System.Threading.Thread.Sleep(50); }}5. 解构ValueTuple
可以通过var (x, y)或者(var x, var y)来解析值元组元素构造局部变量,同时可以使用符号”_”来忽略不需要的元素。
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}]");}由上所述,ValueTuple使C#变得更简单易用。较Tuple相比主要好处如下:
到此这篇关于C# 元组和值元组的具体使用的文章就介绍到这了,更多相关C# 元组和值元组内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
本文实例讲述了Python元组tuple的概念与基本操作。分享给大家供大家参考,具体如下:元组tuple元组tuple的定义元组的创建元组的元素访问和计数1.元
C#学习笔记-浅谈数组复制,排序,取段,元组usingSystem;usingSystem.Collections.Generic;namespaceAppli
IOS开发之Swift元组的实例详解元组是多个值组合而成的复合值。元组中的值可以是任意类型,而且每一个元素的类型可以是不同的。元组声明?123456789//普
元组是不可变的Python对象序列。元组的序列就像列表。唯一的区别是,元组不能被改变,即元组是不可被修改。元组使用小括号,而列表使用方括号。创建一个元组很简单,
一、什么是元组元组不是什么新鲜东西,在数学、python语言还有我们今天要说的C++都有元组。简单地说,元组就是一组东西,例如,在讲代数拓扑的时候,经常把拓扑空