【问题标题】:How can I use Tuple<> to return value instead of using 'out' argument in method?如何使用 Tuple<> 来返回值,而不是在方法中使用 'out' 参数?
【发布时间】:2014-09-08 13:31:26
【问题描述】:

我想使用 Tuple&lt;&gt; 从 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&lt;&gt;返回值

【问题讨论】:

  • @Savanna 你能检查一下吗,是的。然而,它背后的概念并不总是容易理解,也不是得到他想要做的事情的解决方案。

标签: c# .net tuples heap-memory


【解决方案1】:

首先,是的这一行:

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

【讨论】:

  • 感谢您的解释!但是我只需要将 一个 参数传递给方法(因为我在不同的线程中运行它),这就是我使用Tuple&lt;&gt; 的原因。有什么建议吗?
  • @Andrew 是的,不要那样做!将 ref 传递给线程只是 asking 麻烦。现在您很有可能该变量被两个线程“争夺”,可能分配它等等。我会重新考虑您在做什么,因为您有一个线程噩梦正在等待您的设置发生。
  • @Andrew 如果你这样做是为了避免阻塞 UI 线程,你可以考虑使用 await/async 或将整个操作放在另一个线程上(这样你就不必传递这些东西了) .
  • 根据我的任务,我必须在不使用PLINQ, async/await 等的情况下实现多线程。只需手动处理线程即可。我尝试实现的方法必须获取两个参数(XElementDirectoryInfo),但是在新线程中我只能运行签名void MyMethod(object arg){ } 的方法,所以我决定将这两个变量放入@987654335 @。但我还需要从这个方法返回一个值(XElement 类型)......现在我不知道该怎么做。顺便说一句,如果此信息有帮助,则只有一个线程可以使用此方法:)
  • @Andrew 如果这是给学校的,我会问你的导师为什么需要线程化这个方法AddXmlNode 似乎不是新线程的好候选人(另一方面,CreateXmlDocument 可能是)。无论哪种情况,您最好的选择可能是在完成后引发回调或事件,并将填充的对象传递给它,而不是修改参数或使用返回值。
猜你喜欢
  • 2011-10-24
  • 1970-01-01
  • 2021-11-19
  • 2015-05-12
  • 1970-01-01
  • 2013-06-28
  • 1970-01-01
  • 1970-01-01
  • 2016-12-26
相关资源
最近更新 更多