C#通过引用“返回值”调用是否可有可无?

时间:2014-02-20 10:42:16

标签: c# reference return call

我遇到了一些代码,我想知道这个方法中是否需要返回值。 该方法改变了一个二维双数组的某些值。

public double[,] startsimplex_werte(double[,]f)
{
    double standardabstand_s = 1.0;

    double[] vektor_e1 = newdouble[2]{1.0,0.0};
    double[] vektor_e2 = newdouble[2]{0.0,1.0};
    f[1,1]=f[0,1]+vektor_e1[0]*standardabstand_s;
    f[1,2]=f[0,2];
    f[2,1]=f[0,1];
    f[2,2]=f[0,2]+vektor_e2[1]*standardabstand_s;

    return f;
}

这是一个名为:

的二维数组
double[,]f = new double[3,3];

然后在数组上使用该方法:

f = berechne.startsimplex_werte(f);

这种方法在detial中的作用并不重要。我的问题是:

是否需要通过在方法中写入“return f”来返回数组的值。 由于数组是引用类型,因此可以通过引用进行调用。所以该方法已经改变了数组的实际数据成员。我会写没有返回值的相同方法(void方法),只是调用方法而不将其分配给数组。通过参数传输数组非常重要。两个variantes会做同样的,或者我错了吗?

我希望有人可以告诉我我的建议是否属实。

3 个答案:

答案 0 :(得分:3)

你是对的,你不需要返回数组。

您正在修改其内容。如果您要创建一个全新的实例,那么您必须使用ref / out关键字返回它或传递数组。

答案 1 :(得分:3)

你是对的,在这种情况下,不需要返回f,因为它总是与输入相同。

为什么会这样做有几个原因:

  • 它允许函数分配一个新数组并在必要时返回
  • 它更具功能性" API设计方法
  • 如果可能是API的一部分,该API使用获取数组的约定并始终返回一个,并且作者已选择遵循此约定以保持一致性。

答案 2 :(得分:0)

问题是,虽然它是通过引用调用,但只有该引用的副本传递给您的方法而不是原始引用。

只要修改数组的内容,两个引用仍然指向同一个对象。但是如果在方法中分配一个新数组,则此更改不会影响方法之外的对象。

因此,一般情况下,如果要确保orginial对象反映更改或使用该方法的返回值,最好在方法中使用ref关键字。

但在这种特殊情况下,您不需要返回值或关键字ref。但同样,最好使用返回值或ref,具体取决于您正在做什么。