我想使用Tuple<>
从void方法中获取结果值。
小代码示例:
XElement xRoot;
DirectoryInfo di;
XElement xResult;
AddXmlNode(xRoot, di, xResult);
void AddXmlNode(Tuple<XElement, DirectoryInfo, XElement> task)
{
var xNode = (XElement)task.Item3;
xNode = new XElement("dir1");
}
如果我错了,请纠正我:新变量xNode
现在指向与xResult
相同的“托管堆”内存区域?因此,如果xNode
的更改值也会影响xResult
。正确?
如果我错了,请解释如何通过Tuple<>
答案 0 :(得分:2)
首先,是这一行:
var xNode = (XElement)task.Item3;
使两个元素指向在内存中的同一项目中。这意味着如果你这样做了:
xNode.SomeProperty = "Bob";
这两个引用都会得到&#34; Bob&#34;如果他们随后访问了#34; SomeProperty&#34;。但是,你写这个:
xNode = new XElement("dir1");
这会将 xNode
变量重新分配给新对象。他们现在指向两个不同的对象。要获得您想要的内容,您需要通过引用xResult
,我认为您不能使用Tuple
。即使你可以,也会让人感到困惑,我个人也不会这样做。您需要的代码是:
AddXmlNode(new Tuple<XElement, DirectoryInfo>(xRoot, di), ref xResult);
void AddXmlNode(Tuple<XElement, DirectoryInfo> task, ref XElement result)
{
var xNode = (XElement)task.Item3;
xNode = new XElement("dir1");
}
顺便说一下,由于Tuple
是强类型的,因此您不应该对xNode
的初始变量赋值进行强制转换,它应该自动选择它。