概述
VauleTuple,也叫 值元组,是一种具有特定 数量 和 顺序 的 结构体(值)类型 的数据结构。
🍕VauleTuple出自C#7.0,是对出自C#4.0的Tuple的优化。优化点在于:
- VauleTuple为结构体(值)类型,Tuple为类(引用)类型。
- VauleTuple元素是可变的,Tuple是只读的,也就是说可以改变 VauleTuple中的元素值。
- VauleTuple的数据成员是字段,Tuple是属性。
一.创建VauleTuple
🍕利用构造函数创建VauleTuple,正常情况下最多拥有7个元素。如果想要创建更多元素,需要使用VauleTuple的嵌套。
//创建拥有7个元素的ValueTuple
var valueTuple1 = new ValueTuple<int, int, int, int, int, int, int>(1, 2, 3, 4, 5, 6, 7);
//创建拥7有个以上元素的ValueTuple
var valueTuple2 = 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));
🍕利用静态方法创建VauleTuple,最多拥有8个元素。
var valueTuple3= ValueTuple.Create(1, 2, 3, 4, 5, 6, 7, 8);
注意 :使用静态方法Create()
创建ValueTuple时,最后一个元素的类型为ValueTuple<int>
ValueTuple<int, int, int, int, int, int, int, ValueTuple<int>> valueTuple = ValueTuple.Create(1, 2, 3, 4, 5, 6, 7, 8);
二.访问VauleTuple元素
var valueTuple = 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));
🍕访问8个以下元素,使用valueTuple.ItemX
。
Console.WriteLine(valueTuple.Item1);
🍕访问8个或8个以上元素,使用valueTuple.Rest.ItemX
或者valueTuple.ItemX
。
Console.WriteLine(valueTuple.Rest.Item3);
Console.WriteLine(valueTuple.Item10);
三.使用情形
1.发送消息时传递多个数据
🍕该发送消息的形式用于PureMvc中,不必关注这一点,只需注意带有注释的地方就行了。意在表达:当需要将少量数据传递出去时,创建ValueTuple的便捷,不必再额外创建其他类型。
int roleId=1;
string roleName="Tom";
//创建一个ValueTuple并将其发送出去。
SendNotification(GameConsts.Notifications.RERFESH_UI,(roleId,roleName));
...
//接收消息调用相关方法,同时将ValueTuple中的数据传入方法。
case GameConsts.Notifications.RERFESH_UI:
if (notification.Body is ValueTuple<int,string> uiData)
{
RefreshUI(uiData.Item1,uiData.Item2);
}
break;
2.从方法中返回多个值
🍕与参数修饰符ref
和out
有相似的作用。
public ValueTuple<int,string> ReturnValueTuple()
{
return (1, "Bob");
}
🍕方法头中返回值部分也可以替换成以下几种形式。
//简写形式
public (int,string) ReturnValueTuple()
{
return (1, "Bob");
}
//指定元素的名称,便于记忆,并且在调用时可以通过名称获取元素,不易出错。
//实际上ValueTuple并没有“index”和“name”,该名称只用于设计和编译,不是运行时用的。
public (int index,string name) ReturnValueTuple()
{
return (1, "Bob");
}
...
var valueTuple = ReturnValueTuple();
Console.WriteLine($"Index:{valueTuple.index},Name:{valueTuple.name}");
3.解构ValueTuple
🍕在第三种形式中,指定方法头中返回值元素的名称后,在调用方法接收返回值时,可以通过var (x, y)或(var x, var y)来解析ValueTuple元素构造局部变量,同时可以使用符号”_”来忽略不需要的元素。
public (int index, string name) ReturnValueTuple()
{
return (1, "Bob");
}
...
var (index1,name1)= ReturnValueTuple();
Console.WriteLine($"Index:{index1},Name:{valueTuple.name1}");
(var index2, var name2) = ReturnValueTuple();
Console.WriteLine($"Index:{index2},Name:{name2}");
var(_,name3)= ReturnValueTuple();
Console.WriteLine($"Name:{name3}");