C# 如何使用Tuple<&燃气轮机;返回值而不是使用';输出';方法中的参数?
我想使用C# 如何使用Tuple<&燃气轮机;返回值而不是使用';输出';方法中的参数?,c#,.net,tuples,heap-memory,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("d
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");
}
xRoot;
目录信息di;
评价结果;
AddXmlNode(xRoot、di、xResult);
void AddXmlNode(元组任务)
{
var xNode=(XElement)task.Item3;
xNode=新的XElement(“dir1”);
}
如果我错了,请纠正我:新变量xNode
现在指向与xResult
相同的“托管堆”内存区域?因此,如果更改xNode
的值,也会影响xResult
。对吧?
如果我错了,请解释如何通过
Tuple
首先返回值,yes此行:
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");
}
AddXmlNode(新元组(xRoot,di),ref xResult);
void AddXmlNode(元组任务,引用XElement结果)
{
var xNode=(XElement)task.Item3;
xNode=新的XElement(“dir1”);
}
顺便说一下,由于
Tuple
是强类型的,您不需要对xNode
的初始变量赋值进行强制转换,它应该自动拾取。@Savanna您能检查一下吗,是的。然而,它背后的概念并不总是容易理解,解决方案也不是他想要做的。谢谢你的解释!但我只需要将一个参数传递给方法(因为我在不同的线程中运行它),这就是为什么我使用Tuple
。有什么建议吗?@Andrew是的,别那么做!将ref传递到线程只是自找麻烦。现在,该变量很可能被两个线程“争夺”,可能被分配,等等。我会重新考虑您正在做什么,因为您的安装程序正面临线程噩梦。@Andrew如果您这样做是为了避免阻塞UI线程,您可以考虑使用Acth/AsiNC或将整个操作放到另一个线程上(这样您就不必传递这些东西)。根据我的任务,我必须实现多线程,而不使用<代码> PLIQ、异步/等待< /代码>等等。我试图实现的方法必须获得两个参数(XElement
和DirectoryInfo
),但是在一个新线程中,我只能运行signaturevoid MyMethod(object arg){}
,所以我决定将这两个变量放入Tuple
。但是我还需要从这个方法返回一个值(类型为XElement
)。。。现在我不知道该怎么做。顺便说一句,如果这个信息有用的话,只有一个线程可以使用这个方法:)@Andrew如果这是为学校准备的,我会问你的老师为什么这个方法需要线程化AddXmlNode
似乎不是新线程的理想候选线程(CreateXmlDocument
,另一方面,可能是)。在这两种情况下,最好的办法可能是在完成后引发回调或事件,并在其上传递填充的对象,而不是修改参数或使用返回值。