介紹
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參數