如何使用Tuple<>返回值而不是使用'out'方法中的参数
本文关键字:out 方法 参数 Tuple 何使用 返回值 | 更新日期: 2023-09-27 18:13:33
我想使用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<>
返回值
首先,对这条线:
var xNode = (XElement)task.Item3;
使两个元素指向内存中的同一项。这意味着如果您这样做:
xNode.SomeProperty = "Bob";
如果它们随后访问"SomeProperty",则两个引用都将获得"Bob"。但是,您可以这样写:
xNode = new XElement("dir1");
这将重新赋值给 xNode
变量给一个新对象。他们现在指着两个不同的物体。为了得到你想要的,你需要通过ref传递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
的初始变量赋值进行强制类型转换,它应该自动拾取它。