Tuple和 ValueTuple
Posted sea1ee
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Tuple和 ValueTuple相关的知识,希望对你有一定的参考价值。
这个类型还是学习C#7.0的语法在看到的,这边单独拿来学习下。
学习地址:
https://docs.microsoft.com/zh-cn/dotnet/csharp/tuples
https://docs.microsoft.com/zh-cn/dotnet/csharp/deconstruct
C# 元组是使用轻量语法定义的类型,是一个泛型 。 其优点包括:更简单的语法,基于元素数量(称为“基数”)和元素类型的转换规则,以及一致的副本、相等测试和赋值规则。
缺点:Tuple
类将其属性命名为 Item1
、Item2
等。 这些名称未承载任何语义信息。 使用这些 Tuple
类型无法表达各属性的含义。Tuple
类因其引用类型会导致更多性能问题。
在C#7.0和7.1的语法中新增了一些功能,改善了这些缺点。
普通的Tuple
var tuple = new Tuple<int, int,string>(1, 2,"hello"); Console.WriteLine(tuple.Item1); Console.WriteLine(tuple.Item2); Console.WriteLine(tuple.Item3);
新的元组 ValueTuple (这个需要你去安装nuget包)
//需要我们在nuget上安装 System.ValueTuple var tuple = (1, 2); var tuple2 = ValueTuple.Create(1, 2); var tuple3 = new ValueTuple<int, int>(1, 2); Console.WriteLine($"{tuple.Item1}and{tuple.Item2}");
从 C# 7.1 开始,元组的字段名称可能会通过用于初始化此元组的变量提供。我们可以使用字段名称来代替 Item1,Item2
ps: 设置查看项目的语言版本:项目——属性——生存——高级——语言版本
var named = (first: "one", second: "two"); Console.WriteLine($"{named.first}"); //7.0 var sum = 12.5; var count = 5; var accumulation = (count, sum); Console.WriteLine($"{accumulation.count}"); //需要我们的语言版本是7.1
(int a, int b) nullableTuple = (9, 8); //左边命名 Console.WriteLine(nullableTuple.a); (int a, int b) nullableTuple2 = (one: 9, two: 8); //左右两边命名,右边的命名会被忽略
//valueType作返回值 var tt = TestValueTuple(); Console.WriteLine(tt.i); (int i, int j) = TestValueTuple(); Console.WriteLine(i); var (z, x) = TestValueTuple(); Console.WriteLine(z);
public static (int i, int j) TestValueTuple() { return (8, 9); }
Deconstruct 析构该类型的实例 (只能是这个名称),Deconstruct还可以写成扩展方法
public class Person { public string FirstName { get; set; } public string MiddleName { get; set; } public string LastName { get; set; } public string City { get; set; } public string State { get; set; } public Person(string fname, string mname, string lname, string cityName, string stateName) { FirstName = fname; MiddleName = mname; LastName = lname; City = cityName; State = stateName; } // Return the first and last name. public void Deconstruct(out string fname, out string lname) { fname = FirstName; lname = LastName; } public void Deconstruct(out string fname, out string mname, out string lname) { fname = FirstName; mname = MiddleName; lname = LastName; } public void Deconstruct(out string fname, out string lname, out string city, out string state) { fname = FirstName; lname = LastName; city = City; state = State; } }
Person p = new Person("John", "Quincy", "Adams", "Boston", "MA"); //他会根据你的前面的参数个数自动去匹配Deconstruct重载 (string fName, string lName, string city, string state) = p; Console.WriteLine($"Hello {fName} {lName} of {city}, {state}!"); (string name, string lname) = p; Console.WriteLine($"{name}");
以上是关于Tuple和 ValueTuple的主要内容,如果未能解决你的问题,请参考以下文章
详解C# Tuple VS ValueTuple(元组类 VS 值元组)
详解C# Tuple VS ValueTuple(元组类 VS 值元组)
详解C# Tuple VS ValueTuple(元组类 VS 值元组)