- C# 8.0本质论
- (美)马克·米凯利斯
- 432字
- 2022-03-30 10:15:32
6.10 解构函数
构造函数允许获取多个参数并把它们全部封装到一个对象中。但在C# 7.0之前没有一个显式的语言构造来做相反的事情,即把封装好的项拆分为它的各个组成部分。当然可以将每个属性手动赋给变量,但如果有太多这样的变量,就需要大量单独的语句。自C# 7.0推出元组语法后,该操作得到极大简化。如代码清单6.38所示,可声明一个Deconstruct()方法来做这件事情。
代码清单6.38 解构用户自定义类型


该方法可直接调用。如第5章所述,调用前要以内联形式声明out参数。
从C# 7.0起可直接将对象实例赋给一个元组,从而隐式调用Deconstruct()方法(称为解构函数)。这时可认为被赋值的变量已声明。例如:

该语法生成的CIL代码和代码清单6.38突出显示的语法完全一样,只是更简单(而且更让人注意不到调用了Deconstruct()方法)。注意只允许用元组语法向那些和out参数匹配的变量赋值。不允许向元组类型的变量赋值,例如:

也不允许向元组中的具名项赋值:

为声明解构函数,方法名必须是Deconstruct,其签名是返回void并接收两个或更多out参数。基于该签名,可将对象实例直接赋给一个元组而无须显式方法调用。