![C# 8.0本质论](https://wfqqreader-1252317822.image.myqcloud.com/cover/306/43475306/b_43475306.jpg)
上QQ阅读APP看书,第一时间看更新
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=1739267881-iKZ7YCfs3UqMeJeeul7UUUSdP5nV37dF-0-db9f1d3f272251d4afeb92a36f770b9f)
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/d6.38x.jpg?sign=1739267881-Wu1aKVyidzcfxBctcTOTmld67AvWqEiT-0-2cd910d2d33511e116c2d88fb9cba0e1)
该方法可直接调用。如第5章所述,调用前要以内联形式声明out参数。
从C# 7.0起可直接将对象实例赋给一个元组,从而隐式调用Deconstruct()方法(称为解构函数)。这时可认为被赋值的变量已声明。例如:
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/240-2-i.jpg?sign=1739267881-ovo77fclOzu68XITW9jc5MxH6etP0AzV-0-82e73b42ffc4032ee88c97334258d03b)
该语法生成的CIL代码和代码清单6.38突出显示的语法完全一样,只是更简单(而且更让人注意不到调用了Deconstruct()方法)。注意只允许用元组语法向那些和out参数匹配的变量赋值。不允许向元组类型的变量赋值,例如:
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/240-3-i.jpg?sign=1739267881-13VokaqnikngzZKqfP4Wkq9L2JGleuxC-0-9ab06b24d7a1d74b9960f41105368e02)
也不允许向元组中的具名项赋值:
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/240-4-i.jpg?sign=1739267881-Ug4IjLsjDYFdWM2r4lXujb1raWb1G1NM-0-0cc5daa5f7376c0f82a462bc69c9d88d)
为声明解构函数,方法名必须是Deconstruct,其签名是返回void并接收两个或更多out参数。基于该签名,可将对象实例直接赋给一个元组而无须显式方法调用。