C#基础8
·
值元组
Vlaue tuple是轻量级、值类型的元组类型,用于简洁地存储多个不同类型的值
//创建方式1
ValueTuple<int, string> tuple = new ValueTuple<int, string>(1, "张三");
Console.WriteLine(tuple.Item1);
Console.WriteLine(tuple.Item2);
//创建方式2
var Tuple = (1, "张三");
Console.WriteLine(tuple.Item1);
Console.WriteLine(tuple.Item2);
//创建方式3
(int Id, string Name) Tuple = (1, "张三");
//创建方式4
var tuple = (Id: 1, Name: "张三");
Console.WriteLine(tuple.Id);
Console.WriteLine(tuple.Name);
解构值元组
var tuple = (Id: 1, Name: "张三");
//定义变量
int Id;
string Name;
(Id, Name) = user;
忽略某个元素(用_)
var (_,Name) = user;
Console.WriteLine(Name);
作为方法返回值(最常用场景)
public static (bool success,string Message,int Code) Login(string username,string password)
{
return (true,"登录成功", 200);
}
public void Login(string username,string password,out bool success, string Message, int Code)
{
success = true;
Message = "登陆成功";
Code = 200;
}
static (bool Success, string Message, int Code) Login(string username, string password)
{
if (username == "admin" && password == "123456")
{
return (Success: true, Message: "登录成功", Code: 200);
}
else
{
return (Success: false, Message: "用户名或密码错误", Code: 401);
}
}
调用方法1
var (isSuccess, msg, code) = Login("admin", "123456");
Console.WriteLine($"登录结果:{(isSuccess ? "成功" : "失败")},消息:{msg},状态码:{code}");
调用方法2
var loginResult = Login("test", "123");
Console.WriteLine($"登录失败:{loginResult.Message}({loginResult.Code})");
作为泛型使用
//初始化字典并且添加初始值
Dictionary<int,(int a, float b ,string c)> dic = new Dictionary<int, (int a, float b, string c)>() { { 1,(a:11,b:20,c:"字符串") },{ 2,(a:20,b:10,c: "123")}};
//单独添加元素
dic.Add(1,(a:11,b:20,c:"字符串"));
//读取元素
var tuple1 = dic[1];
Console.WriteLine(tuple1.a);
Console.WriteLine(tuple1.b);
Console.WriteLine(tuple1.c);
foreach (var item in dic)
{
//输出元组的值
Console.WriteLine(item.Value.a);
Console.WriteLine(item.Value.b);
Console.WriteLine(item.Value.b);
//输出Key值
Console.WriteLine(item.Key);
}
字典的值可以使用值元组里可以有多个类型的值
主要特性
- 可变性 (Mutability):与只读的
System.Tuple不同,值元组的字段是可变的,你可以修改它们的值。1var point = (X: 10, Y: 20); 2point.X = 100; // 允许修改 - 字段而非属性:值元组的成员(如
Item1,Item2)是公共字段,而不是属性。 - 支持解构:可以方便地将元组的值解构到单独的变量中。
1var person = ("Alice", 30); 2var (name, age) = person; // 解构 3// 现在 name = "Alice", age = 30
关于元素数量的限制
C# 的值元组在底层实现上有一个重要的细节:
- 8个及以下元素:对于包含1到8个元素的元组,.NET 提供了对应的
ValueTuple<T1>,ValueTuple<T1, T2>, ...,ValueTuple<T1, ..., T8>结构。 - 超过8个元素:当元组包含超过8个元素时,它会通过嵌套的方式实现。前7个元素作为
Item1到Item7,而第8个及之后的所有元素会被打包到另一个ValueTuple中,并赋值给Rest字段。
这意味着,虽然你可以创建包含任意数量元素的元组,但访问第8个及以后的元素时,语法会变得复杂,需要通过 .Rest 字段来访问。
// 创建一个包含9个元素的元组
var longTuple = (1, 2, 3, 4, 5, 6, 7, 8, 9);
// 访问前7个元素
int first = longTuple.Item1; // 1
// 访问第8个元素
int eighth = longTuple.Rest.Item1; // 8
// 访问第9个元素
int ninth = longTuple.Rest.Item2; // 9
因此,在实际开发中,如果数据结构非常复杂或包含大量字段,通常建议使用类(class)或记录(record)来代替元组,以保证代码的清晰度和可维护性。
更多推荐
所有评论(0)