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