介绍
Tuple的中文名:元组
Tuple的作用:
存储一组数据
可以使方法返回多个值,而不用out参数
在.NET Framework,4.7以前版本的元组叫Tuple,而4.7版本以后又引入一个元组叫ValueTuple
而在.NET Core中Tuple在1.0版本就存在,而在2.0引入了ValueTuple
如果在.NET Framework 4.7以前版本或.NET Core2.0以前版本要使用ValueTuple,可以通过NuGet安装System.ValueTuple
Tuple是C#4.0时出的新功能,而ValueTuple是C#7.0出的功能
Tuple与ValueTuple的基本区别就是,Tuple是类class,而ValueTuple是结构struct
ValueTuple的功能比Tuple强大
下面看看Tuple与ValueTuple的基本用法
用法
Tuple
创建元组
//通过构造函数来创建
var a = new Tuple<int, string>(1001, "Jack");
//通过静态方法Create来创建
var b = Tuple.Create(1002, "Tom");
Tuple最多可以创建8个元素,当然可以在元素中在定义Tuple
访问元组数据
可以通过Item1,Item2访问元组数据
//访问数据
var id = a.Item1;
var name = a.Item2;
元组作为方法的返回值
public Tuple<int, string> GetUserInfo()
{
return Tuple.Create(1001, "Jack");
}
接收数据
var user = GetUserInfo();
Tuple的功能较弱
1.元素只能读取,不能修改
2.只能通过Item1的形式访问元素,不能定义元素的名称
下面看看ValueTuple的用法,ValueTuple将解决上面Tuple的问题
ValueTuple
创建元组
有像上面Tuple类似的创建方法
var b = new ValueTuple<int, string>(1001, "Jack");
var d = ValueTuple.Create(1002, "Tom");
也可以通过 ( , ) 来创建,使代码更简洁
ValueTuple<int,string> userInfo1 = (1003, "Mark");
(int, string) userInfo2 = (1003, "Mark");
var userInfo3 = (1003, "Mark");
定义时给元素起个名
var userInfo1 = (id: 1003, name: "Mark");
(int id, string name) userInfo2 = (1003, "Mark");
访问元组数据
也是通过Item1,Item2访问元组数据
ValueTuple有一个好处就是可以定义元素的名称,起一个有意义的名称
(int id, string name) userInfo = (1003, "Mark");
这样可以通过id和name访问数据了
ValueTuple不仅可以访问数据,还可以修改数据,即可读写
(int id, string name) userInfo = (1003, "Mark");
userInfo.id = 1010;
userInfo.name = "haha";
元组作为方法的返回值
可以这样
public ValueTuple<int, string> GetUserInfo()
{
return ValueTuple.Create(1003, "Mark");
}
也可以简写
public (int, string) GetUserInfo2()
{
return (1003, "Mark");
}
接收数据
可以通过定义元组接收
(int, string) userInfo2 = GetUserInfo2();
也可以通过var接收
var userInfo3 = GetUserInfo2();
当然可以通过定义元组并定义元素名称,方便访问数据
(int id, string name) userInfo4 = GetUserInfo2();
var uid = userInfo4.id;
var uname = userInfo4.name;
这也可以在方法的返回值中定义元素名称
public (int id, string name) GetUserInfo2()
{
return (1003, "Mark");
}
定义两个变量接收数据
(int id, string name) = GetUserInfo2();
var uid = id;
var uname = name;
这种与上面的定义不同,这里定义的是两个变量
//定义一个ValueTuple
(int id, string name) userInfo1 = (1003, "Mark");
var uid = userInfo1.id;
var uname = userInfo1.name;
//定义两个变量
(int id, string name) = (1003, "Mark");
var uid2 = id;
var uname2 = name;
元组兼容性问题
元组的兼容性就是指元组的元素类型和顺序相同,名称不同无所谓
总结
可以说Tuple有的功能,ValueTuple都有,所以一般用ValueTuple
ValueTuple使用 ( , ) 方式,使代码更简洁
ValueTuple既能读,又能写,比Tuple更实用
ValueTuple支持元素命名,方便使用
ValueTuple能作为方法的返回值,一次返回多个值,不用重新定义类作为参数或使用out参数