ValueTuple学习
ValueTuple是C# 7.0的新特性之一,.Net Framework 4.7以上版本可用。
值元组也是一种数据结构,用于表示特定数量和元素序列,但是是和元组类不一样的,主要区别如下:
- 值元组是结构,是值类型,不是类,而元组(Tuple)是类,引用类型;
- 值元组元素是可变的,不是只读的,也就是说可以改变值元组中的元素值;
- 值元组的数据成员是字段不是属性。
值元组的具体使用如下:
1. 如何创建值元组
.Net Framework值元组只支持1到7个元组元素,如果有8个元素或者更多,需要使用值元组的嵌套和Rest属性去实现。另外ValueTuple类可以提供创造值元组对象的静态方法。
1:利用构造函数创建元组:
var valueTuple1 = new ValueTuple<string, string, string>("张三", "李四", "王二"); string name1 = valueTuple1.Item1; string name2 = valueTuple1.Item2; string name3 = valueTuple1.Item3; Console.WriteLine($"我是{name1},我是{name2},我是{name3}"); //////////////////////////////////////////////////////////// var valueTuple3 = 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)); int item1 = valueTuple3.Item1; int item10 = valueTuple3.Rest.Item3; Console.WriteLine($"item1:{item1},item10:{item10}");
2:利用Tuple静态方法构建元组,最多支持八个元素:
var valueTuple2 = ValueTuple.Create<int, int, int>(1, 2, 3); int val1 = valueTuple2.Item1; int val2 = valueTuple2.Item2; int val3 = valueTuple2.Item3; Console.WriteLine($"{val1},{val2},{val3}"); var valueTuple4 = ValueTuple.Create<int, int, int, int, int, int, int, int>(1, 2, 3, 4, 5, 6, 7, 8); int v1 = valueTuple4.Item1; int v8One = valueTuple4.Item8; int v8Two = valueTuple4.Rest.Item1; Console.WriteLine($"item1:{v1},item8:{v8One},item8:{v8Two}");
注意:这里构建出来的Tuple类型其实是Tuple<int, int, int, int, int, int, int, Tuple<int>>,因此testTuple8.Rest取到的数据类型是Tuple<int>,因此要想获取准确值需要取Item1属性。对于上面的例子,要访问第八个元素,既可以通过testTuple4.Rest.Item1访问,也可以通过testTuple4.Item8获取
2. 表示一组数据
如下创建一个值元组表示一个学生的三个信息:名字、年龄和身高,而不用单独额外创建一个类。
var valTupleInfo = new ValueTuple<string, int, string>("张三", 16, "地球"); string valName = valTupleInfo.Item1; int valAge = valTupleInfo.Item2; string valAdd = valTupleInfo.Item3; Console.WriteLine($"你好,我叫{valName},我今年{valAge}岁,来自{valAdd}");
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:
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}]"); }
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 ValueTuple<string, int, uint>("Bob", 28, 175); WriteStudentInfo(t); }
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}]"); }
自己在读C#7.0本质论这一本书,见到了元组这个东西,感觉灵活实用,特地学习一下,总结一下。如有错误请留言,如觉得不错请推荐,谢谢支持!!!