网站地图怎么做html,濮阳网站推广,江苏建设厅官方网站,国内建筑设计公司排名官方文档#xff1a;析构元组和其他类型 - C# | Microsoft Learn
标签#xff1a;Deconstruct、Tuple、record、模式匹配
PS#xff1a;record相关内容后续还会继续更新#x1f504;
模式匹配可以查看我的另一篇#x1f449;模式匹配 目录1. 概述2. 基本用法2.1 元组解…官方文档析构元组和其他类型 - C# | Microsoft Learn
标签Deconstruct、Tuple、record、模式匹配
PSrecord相关内容后续还会继续更新
模式匹配可以查看我的另一篇模式匹配 目录1. 概述2. 基本用法2.1 元组解构2.2丢弃符3. 进阶使用3.1 为自定义类型添加解构能力1. 为 Person 类实现解构2 扩展方法解构3.2 与记录(record) 的协同3.3 与模式匹配的联动C# 84. 限制与最佳实践5. 总结1. 概述
Deconstruct解构 是 C# 7.0 引入的语法糖 允许以简洁的语法从元组或对象中提取多个数据成员避免逐个访问字段的繁琐操作。
它让元组、自定义类型、记录(record)等数据的“拆包”变得非常直观。
核心思想将一个复合对象“拆分”成其组成部分。
关键词
Deconstruct 方法实例或扩展方法 解构赋值Deconstruction Assignment 丢弃符 _ (discard) 元组 (T1, T2, …) 的隐式解构
2. 基本用法
2.1 元组解构
元组Tuple自带的解构支持是最直接的应用。
// 创建一个元组
var person (Alice, 30); 显式指定类型 (string name1, int age1) person; // 显式类型声明并解构一次性声明并解构 (最常见) var (name2, age2) person; // 使用 var 推断类型声明并解构也支持混合使用显式与 var 声明但不建议 (string name3, var age3) person;析构到已声明的变量和混合声明与赋值 string name4 Eoch;
(name4, int age4) person变换元组的解构与构造 构造 (Construction)等号右边 (b, a) 会构造一个新的元组这个元组的两个元素分别是当前变量 b 和 a 的值解构 (Deconstruction)等号左边 (a, b) 会解构这个新元组将其元素按顺序赋值给变量 a 和 b int a 5, b 10;
(a, b) (b, a); // a 现在是 10, b 现在是 52.2丢弃符
在处理解构时可能只对对象的一部分数据感兴趣。
C# 提供了 弃元_ 来忽略不关心的输出参数,其值将被忽略使代码意图更清晰。
Person person new Person(Bruce, Banner, 40);// 只解构出 Age忽略 FirstName 和 LastName
(_, _, int age) person;// 或者如果你只关心 LastName
(string _, string lastName, _) person; // 第一个参数也用弃元Console.WriteLine(age); // 输出40
Console.WriteLine(lastName); // 输出Banner3. 进阶使用
3.1 为自定义类型添加解构能力
要使你的自定义类或结构体能够被解构你需要为其定义一个或多个 Deconstruct方法。
规则
方法名必须为 Deconstruct方法必须是 public void所有参数都必须使用 out 修饰符参数的顺序和数量决定了你解构时变量的顺序和数量
1. 为 Person 类实现解构
public class Person
{public string FirstName { get; set; }public string LastName { get; set; }public int Age { get; set; }// 构造函数public Person(string firstName, string lastName, int age){FirstName firstName;LastName lastName;Age age;}// 实现 Deconstruct 方法// 此方法允许将 Person 解构成 (firstName, lastName, age)public void Deconstruct(out string firstName, out string lastName, out int age){firstName FirstName;lastName LastName;age Age;}// 重载提供另一种解构方式例如只解构出fullName、agepublic void Deconstruct(out string fullName, out int age){fullName ${FirstName} {LastName};age Age;}
}2 扩展方法解构 // 1. 定义静态扩展类
public static class PersonExtensions
{// 2. 在扩展类中声明 Deconstruct 扩展方法。注意必须是静态(static)且无返回值(void)所有要解构出的参数都使用 out 修饰符。public static void Deconstruct(this Person p,out string firstName,out string lastName,out int age){firstName p.FirstName;lastName p.LastName;age p.Age;}// 3. 还可以再写其他重载public static void Deconstruct(this Person p,out string fullName,out int age){fullName ${p.FirstName} {p.LastName};age p.Age;}
}
3.2 与记录(record) 的协同
录类型record天然支持基于位置参数的解构功能。
record Person(string FirstName, string LastName);var (f, l) new Person(Ada, Lovelace);3.3 与模式匹配的联动C# 8
从C# 8开始解构功能与模式匹配语法深度集成特别是在 switch 表达式中可以直接对元组或可解构类型进行模式匹配。
例如属性模式property pattern与位置模式positional pattern的结合使用。编译器会自动解构 Point 类型的坐标值然后通过条件模式匹配进行判断。
static string Quadrant(Point p) p switch
{( 0, 0) 第一象限,( 0, 0) 第二象限,_ 其他
};4. 限制与最佳实践 命名一致性 元组字段名与 Deconstruct 方法的 out 参数名无需强制一致但保持命名一致性能显著提升代码的可读性和可维护性。 可空性处理 当类型中的字段可能为 null 时应在 Deconstruct 方法内部进行必要的空值防御性检查并将对应的 out 参数类型标记为可空如 out string? name。 避免滥用 解构虽方便但过度使用会让代码意图变得模糊。应仅在能“明显提升可读性”的场景如同时获取多个相关返回值下使用而非替代所有属性访问。 out 参数的限制 在异步方法标记为 async中不能使用 out 参数因此也无法直接进行解构操作。 常见的解决方法是先在同步代码中解构将结果存入变量再在异步方法中使用这些变量。 // 异步方法中无法直接解构
// var (name, age) await GetPersonAsync(); // 错误// 解决方案先同步获取对象再解构
var person await GetPersonAsync();
var (name, age) person; // 正确5. 总结
C# 的解构功能将对象或元组分解到一组独立的变量中简化了从元组或对象中提取多个值的操作
元组析构直接解包元组元素支持类型推断和弃元_ 自定义类型析构通过实现 Deconstruct 方法支持解构扩展方法析构为现有类型添加析构能力集成使用与元组、模式匹配、Record集成、适合变量交换及多返回值方法的调用场景。适合场景适用于数据模型、DTO、坐标、元组等主要存储数据的简单对象。
Deconstruct
├── 内建ValueTuple / record 位置参数
├── 自定义实例方法 或 扩展方法 void Deconstruct(out T1, out T2, ...)
└── 语法形式├─ var (a, b) obj;├─ (int a, _) obj;└─ switch 模式 (x, y)