一尘不染

是否可以在C#中返回对变量的引用?[重复]

c#

这个问题已经在这里有了答案

为什么C#不支持返回引用? (4个答案)

7年前关闭。

例如,我可以返回对double值的引用吗?

这就是我想做的:

ref double GetElement()
{
   ......
   // Calculate x,y,z
   return ref doubleArray[x,y,z];
}

像这样使用

void func()
{
   GetElement()=5.0;
}

就像在C ++中返回双指针一样……我知道我编写它的方式是错误的..但是有正确的方法吗?


阅读 325

收藏
2020-05-19

共1个答案

一尘不染

更新资料

此功能已添加到C#7中。您可以使用语法,就像在问题中张贴的一样。例如:

double[,,] doubleArray = new double[10,10,10];

ref double GetElement()
{
   var (x,y,z) = (1,2,3);
   return ref doubleArray[x, y, z];
}

埃里克·利珀特(Eric
Lippert)的答案很
详细。我可能会删除此答案,但由于它是已接受的答案,因此无法删除。

原始答案

C#中的值类型始终按值传递。对象始终按值传递其引用。正如Axarydax所指出的,这种“不安全”代码的变化。

避免此约束的最简单,最安全的方法是确保双精度对象以某种方式附加到对象。

public class MyObjectWithADouble {
    public double Element {get; set;} // property is optional, but preferred.
}

...
var obj = new MyObjectWithADouble();
obj.Element = 5.0

我还想指出,我对如何将双精度型分配给三维数组感到有些困惑。 您可能需要澄清要做什么。

我想我对您目前的打算了解得更好。您想要返回值在给定数组中的位置,然后能够在该位置更改值。这种模式打破了C#的一些预期范式,因此我建议考虑其他方法来实现您想要的目标。但是,如果这样做确实有意义,我会做更多类似的事情:

public class 3dArrayLocation {public int X; public int Y; public int Z;}

...

public 3dArrayLocation GetElementLocation(...)
{
    // calculate x, y, and z
    return new 3dArrayLocation {X = x, Y = y, Z = z}
}

...

var location = GetElementLocation(...);
doubleArray[location.X, location.Y, location.Z] = 5.0;
2020-05-19