【问题标题】:C# call by reference "return value" is dispensable?C#通过引用调用“返回值”可有可无?
【发布时间】:2014-03-21 05:55:36
【问题描述】:

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

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通过参数传输数组很重要。两个变体都会做同样的事情,还是我错了?

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

【问题讨论】:

  • 不需要返回f,可以新建一个二维数组,不接触参数就返回。在您的情况下,您不需要这样做,因为 f 的唯一目的是作为返回对象。

标签: c# reference return call


【解决方案1】:

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

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

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

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

【讨论】:

【解决方案2】:

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

这样做可能有几个原因:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我个人还是会在这里添加ref,只是为了确保调用者知道该函数将更改输入。
    • @CompuChip 您不应使用ref 关键字来提高可读性。您在滥用语言功能。
    • 参数 f 是对内存中对象的引用。不需要通过引用传递它(使用“ref”关键字)。
    • @CompuChip 他们应该只是 RTFM :P 另外,作为客户,您应该知道您的引用类型实例的成员可能会发生变化。但最重要的是,这就是为什么我们永远不应低估为方法选择名称的重要性。他们应该为自己说话,并清楚地传达您的意图。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-28
    • 2020-08-01
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多