C# -----元组

元组 概念:

1.使方法 可以返回多个返回值 而不需要借助 out ref 关键字。

2.使方法 可以返回多个返回值 而不需要借助 out ref 关键字,Tuple这个泛型类,可以允许我们返回多个参数。

1.基于 .Net4.0 框架的元组-Tuple:

创建一个元组 Tuple:

  1. Tuple test3 = new Tuple(“2”);

  2. Tuple test3 = new Tuple(1, 2, 3, 4, 5, 6, 7, new Tuple(8));`

实例1:

	   static Tuple GetFullName() => new Tuple("first", "second", "third");

        public static void OldTuple()
        {
            var fullName = GetFullName();

            Console.WriteLine(fullName.Item1); // 数据下标1

            Console.WriteLine(fullName.Item1); // 数据下标2

        }

如此为一个元组 Tuple,由 fullName 接收来自GetFullName()函数所返回的值,而这个返回值为Tuple类型(泛型)

实例2:

       static Tuple Tupletext1()
        {
            int id = 6;

            string name = "王";

            int num = 50;

            return Tuple.Create(id, name, num); //创建返回对象 Tuple
        }

        public static void text1()
        {
            Tuple tuple = Tupletext1();

            Console.WriteLine(tuple.Item1);

            Console.WriteLine(tuple.Item2);

            Console.WriteLine(tuple.Item3);
        }

优点:此等 Tuple 可以不借助于 ref 和 out 参数从而返回出多个 多类型的数据,这些数据被保存在一个元组中方便调用

缺点:
1)Tuple 会影响代码的可读性,因为它的属性名都是:Item1,Item2… 。

2)Tuple 还不够轻量级,因为它是引用类型(Class)。

接收方式与上例不同,此次创建了一个新的 Tuple 类型对象用来接受 ReturnOldTuple() 函数中所返回的数据。 两种方式 都可 任选其一。

2.C# 7.0新特性ValueTuple 新元组

  1. ValueTuple test = new ValueTuple();

  2. ValueTuple test2 = ValueTuple.Create(2,“5”);

C# 7 中的元组(ValueTuple)解决了上述两个缺点:

 1. ValueTuple 支持语义上的字段命名。
  2.ValueTuple 是值类型(Struct)

实例1:

	  static (string name1, string name2, string name3) GetFullNum() => ("张1", "张2", "张3");

        public static void text1()
        {
            var tuple = GetFullNum();

            Console.WriteLine(tuple.name1);

            Console.WriteLine(tuple.name2);

            Console.WriteLine(tuple.name3);
        }

如此 打印获得结果为:name1、name2、name3。 可以看到在编写中已经去除了 Item 1 2 3 从而改为返回值中的元素名称。

实例2:

     public static (int id, string name, int num) ReturnNewValueTupleTwo()
       {

            int id = 6;

            string name = "王";

            int num = 50;

            return (id, name, num);

            //return ValueTuple.Create(id, name, num); //方法二
       }
       public static void text1()
        {
            (int id, string name, int num) valueTupleTwo = ReturnNewValueTupleTwo(); //应该使用这种方法声明的变量接受

            //var valueTupleTwo = ReturnNewValueTupleTwo();// 方法二

            Console.WriteLine(valueTupleTwo.id);

            Console.WriteLine(valueTupleTwo.name);

            Console.WriteLine(valueTupleTwo.num);
      }

如上 为第二种返回ValueTaple的方法,将获得返回值:6、王、50. 也可通过 .名称 的方式获得值。

3.实际使用场景:

我们使用Tuple来完成一次简单数据集的传递工作。

将Tuple作为返回值

  public List> GetUsers(){ 

  string sql="select ID,Name,CreateTime from Tbl_Users";

  using (SqlDataReader r = SqlHelper.ExecuteReader(Connections.AdminDBConString, CommandType.Text, sql))   
 {             
        List> list = new List>(); 
        
         while (r.Read()) 
          { 

              Tuple t = new Tuple(Convert.ToInt32(r[0]),r[1].ToString(),Convert.ToDatetime(r[2])); 
              
              list.Add(t);
          } 

              return list; 

          }

}

使用也非常方便:

List> list=GetUsers();

foreach(Tuple t in list)

{ 

 Console.write(t.Item1);//ID 

 Console.write(t.Item2);//Name

   Console.write(t.Item3);//CreateTime

}

4.值类型(Struct)和引用类型(Class)的区别

  1. 值类型的数据存储在内存的栈中;引用类型的数据存储在内存的堆中,而内存单元中只存放堆中对象的;
  2. 值类型存取速度快,引用类型存取速度慢。
  3. 值类型表示实际数据,引用类型表示指向存储在内存堆中的数据的指针或引用
  4. 值类型继承自System.ValueType,引用类型继承自System.Object
  5. 值类型的变量直接存放实际的数据,而引用类型的变量存放的则是数据的地址,即对象的引用。

你可能感兴趣的:(C# -----元组)