Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Tuple<&燃气轮机;返回值而不是使用';输出';方法中的参数?_C#_.net_Tuples_Heap Memory - Fatal编程技术网

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
),但是在一个新线程中,我只能运行signature
void MyMethod(object arg){}
,所以我决定将这两个变量放入
Tuple
。但是我还需要从这个方法返回一个值(类型为
XElement
)。。。现在我不知道该怎么做。顺便说一句,如果这个信息有用的话,只有一个线程可以使用这个方法:)@Andrew如果这是为学校准备的,我会问你的老师为什么这个方法需要线程化
AddXmlNode
似乎不是新线程的理想候选线程(
CreateXmlDocument
,另一方面,可能是)。在这两种情况下,最好的办法可能是在完成后引发回调或事件,并在其上传递填充的对象,而不是修改参数或使用返回值。