如何使用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<>返回值

如何使用Tuple<>返回值而不是使用'out'方法中的参数

首先,这条线:

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的初始变量赋值进行强制类型转换,它应该自动拾取它。