C# -- ValueTuple学习1

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本质论这一本书,见到了元组这个东西,感觉灵活实用,特地学习一下,总结一下。如有错误请留言,如觉得不错请推荐,谢谢支持!!!

posted @ 2019-10-23 11:20  初晨~  阅读(352)  评论(0)    收藏  举报