这个问题已经在这里有了答案 :
为什么C#不支持返回引用? (4个答案)
7年前关闭。
例如,我可以返回对double值的引用吗?
这就是我想做的:
ref double GetElement() { ...... // Calculate x,y,z return ref doubleArray[x,y,z]; }
像这样使用
void func() { GetElement()=5.0; }
就像在C ++中返回双指针一样……我知道我编写它的方式是错误的..但是有正确的方法吗?
此功能已添加到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;