posted at 2020.9.4 09:48 by 风信子
元组就是将一组松散的对象简单地组合在一起。元组比数组的灵活性略强,因为数组中所有元素的类型是统一的,而元组使用了泛型参数,使得每个元素的类型相互独立。元组不同于类和结构,类和结构是高度整合的数据类型,其中要实现各种复杂的功能。
.NET框架最早引入元组的概念,是通过Tuple类实现的,而且存在多个泛型版本,可容纳元素数量为1~8个。元组中将所有元素分配给Item*属性,其中*表示序号,例如Item1、Item2、Item3等。
创建元组实例有三种方法:
(1) 直接调用泛型版本Tuple类构造函数。如:
Tuple < int, long, char > t = new Tuple < int, long, char > ( 1000,20000L, ’p’ );
(2) 直接调用Tuple类的Create方法,此方法为静态方法,格式如下:
var k = Tuple.Create < byte, string > ( 255, ”full” );
(3) Vaule Tuple的使用方法与Tuple类似。但VauleTuple是值类型,不需要分配堆内存,效率更优于Tuple类。ValueTuple支持初始化后仍然可以修改元素。它也得到C#语法的支持,可以用简洁的语法声明。如:
① var a = ( 100, ( byte ) 15, true );
② ValueTuple < string, string > b = ( “Jack”, ”Bob” );
③ ( long, uint) f = ( 123454321L, 7899 );
声明元组时,如果不使用变量名,则编译器会将元组中的各个字段自动解构为单独的变量,当然也可以用var关键字来声明。
C#语言的元组还支持将用户自定义的类型进行解构,即可以将某个类的属性解构为元组。做法是:在类型中定义一个公共方法,返回类型为void,方法命名为Deconstruct。
元组的另一个作用—充当方法的返回值。尤其是在一个方法中需要同时返回多个对象给调用方的时候,虽然可以使用out参数,但使用元组可以更简洁。
下面举一实例:
(1)新建一个控制台应用程序项目。
(2)定义一个返回三元组的方法。
static (string, int, string) GetData()
{
return ("Test 1", 35, "Test 2");
}
(3) 调用上述方法,获取返回的元组后,不对字段重命名,直接输出。
var k = GetData();
Console.WriteLine("未对字段重命名:");
Console.WriteLine("Item1 = {0}, Item2 = {1}, Item3 = {2}", k.Item1, k.Item2, k.Item3);
(4)也可以在获取返回的元组后,对字段重命名。
var (Mark1, Count, Mark2) = GetData();
Console.WriteLine("\n对字段进行重命名:");
Console.WriteLine($"{nameof(Mark1)}={Mark1},{nameof(Count)}={Count}, {nameof(Mark2)} = {Mark2}");
(5)在Program类中定义一个方法,在返回二元组时,重命名字段。
static (int Number1, int Number2) GetNumbers()
{
Random rand = new Random();
return (rand.Next(0, 1000), rand.Next(0, 1000));
}
(6)调用方法,获取返回的元组,并直接访问已经命名的字段。
var d = GetNumbers();
Console.WriteLine("\n返回带重命名字段的元组:");
Console.WriteLine($"{nameof(d.Number1)}={d.Number1}, {nameof(d.Number2)} = {d.Number2}");
(7) 运行应用程序,控制台输出结果如图所示:
a48129f4-7b00-4ded-aa13-e73c36bddc5e|0|.0|96d5b379-7e1d-4dac-a6ba-1e50db561b04
Tags: C#, 程序, 泛型, 方法, 类, 数据
IT技术