繁体   English   中英

通过引用C#调用“返回值”是否必要?

[英]C# call by reference “return value” is dispensable?

即时通讯面临一些代码,我想知道这种方法是否需要返回值。 该方法更改了二维双精度数组的某些值。

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);

该方法在实际操作中的作用并不重要。 我的问题是:

是否有必要通过在方法中写入“ return f”来返回数组的值。 由于数组是引用类型,因此存在按引用的调用。 因此该方法已经更改了数组的实际数据成员。 我会写相同的方法,没有返回值(void方法),只调用该方法而不将其分配给数组。 imo通过参数传递数组只是重要的。 两种变体都一样,还是我错了?

我希望有人能告诉我我的建议是否正确。

没错,您不需要返回数组。

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

没错,在这种情况下,无需返回f因为它始终与输入相同。

这样做有几个原因:

  • 它确实允许函数分配新数组并在必要时返回该数组
  • 这是一种更加“实用”的API设计方法
  • 如果可能是API的一部分,该API使用采用数组并始终返回一个数组的约定,并且作者选择遵循此约定以保持一致性。

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

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

因此,通常,如果要确保原始对象能够反映更改或使用该方法的返回值,最好在方法中使用ref关键字。

但是在这种特殊情况下,您不需要返回值或关键字ref 但是同样,最好根据您的操作使用返回值或ref

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM