![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=1739354639-DY3ShFLbAjb2uhQ4Nmrv4Qk81ajZTld3-0-c36dc98c2ce2323d69d44fbbe15024c6)
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/d6.38x.jpg?sign=1739354639-dTIxWt4LvrlYqIHcdO4CohdVBtryT8Jz-0-bc6a18dd2a6c3bab0d0f534616f5a152)
该方法可直接调用。如第5章所述,调用前要以内联形式声明out参数。
从C# 7.0起可直接将对象实例赋给一个元组,从而隐式调用Deconstruct()方法(称为解构函数)。这时可认为被赋值的变量已声明。例如:
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/240-2-i.jpg?sign=1739354639-hqjtlT0vAW0vdkWdPdXDLlheJGwsUeuR-0-3c83c9fdcb4d3c1fbe3453b1241a96a2)
该语法生成的CIL代码和代码清单6.38突出显示的语法完全一样,只是更简单(而且更让人注意不到调用了Deconstruct()方法)。注意只允许用元组语法向那些和out参数匹配的变量赋值。不允许向元组类型的变量赋值,例如:
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/240-3-i.jpg?sign=1739354639-PCfc4NoIKrILHxW75AQk7fEhIoReZzJJ-0-b1509655987e7ae021b64f6522b15c24)
也不允许向元组中的具名项赋值:
![](https://epubservercos.yuewen.com/7885FF/22815793809130806/epubprivate/OEBPS/Images/240-4-i.jpg?sign=1739354639-VdgqTC6b7PTq6Q3A6JDxBZOGHq01OQwk-0-0858c8b8c41e88669dfc7d873031afe9)
为声明解构函数,方法名必须是Deconstruct,其签名是返回void并接收两个或更多out参数。基于该签名,可将对象实例直接赋给一个元组而无须显式方法调用。