我怎样才能使用Tuple<>返回价值而不是使用' out'方法中的参数?

时间:2014-07-17 15:21:32

标签: c# .net tuples heap-memory

我想使用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<>

返回价值

1 个答案:

答案 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的初始变量赋值进行强制转换,它应该自动选择它。