- C# 8.0本质论
- (美)马克·米凯利斯
- 432字
- 2022-03-30 10:15:32
6.10 解构函数
构造函数允许获取多个参数并把它们全部封装到一个对象中。但在C# 7.0之前没有一个显式的语言构造来做相反的事情,即把封装好的项拆分为它的各个组成部分。当然可以将每个属性手动赋给变量,但如果有太多这样的变量,就需要大量单独的语句。自C# 7.0推出元组语法后,该操作得到极大简化。如代码清单6.38所示,可声明一个Deconstruct()方法来做这件事情。
代码清单6.38 解构用户自定义类型
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/d6.38.jpg?sign=1739121105-htwG63v2I95pDoLTuImG9ZLKRFE2KrZE-0-ca72284a02bae765dcab4b0364212c3e)
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/d6.38x.jpg?sign=1739121105-EP15JVLiNulfGMUleJNpw02CZ3i1WuYu-0-4c09107cb7c33c65c2878782df723851)
该方法可直接调用。如第5章所述,调用前要以内联形式声明out参数。
从C# 7.0起可直接将对象实例赋给一个元组,从而隐式调用Deconstruct()方法(称为解构函数)。这时可认为被赋值的变量已声明。例如:
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/240-2-i.jpg?sign=1739121105-mhzGFZgnOCTwJrLGmOG6VSkLicjsVmPp-0-32fea6b0a31fee271f5e1fcff3610c04)
该语法生成的CIL代码和代码清单6.38突出显示的语法完全一样,只是更简单(而且更让人注意不到调用了Deconstruct()方法)。注意只允许用元组语法向那些和out参数匹配的变量赋值。不允许向元组类型的变量赋值,例如:
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/240-3-i.jpg?sign=1739121105-PBk775xFl4ZIsw257ndSmuU1U5vUy4zQ-0-119189f24a758c88e72f104ac64cdf2d)
也不允许向元组中的具名项赋值:
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/240-4-i.jpg?sign=1739121105-RYI0zVLdsi44i1hxLvHEOl6oGa5nRG0D-0-676be9abe9c2f50e6df764eebb6b451a)
为声明解构函数,方法名必须是Deconstruct,其签名是返回void并接收两个或更多out参数。基于该签名,可将对象实例直接赋给一个元组而无须显式方法调用。