【问题标题】:using ref or out modifiers with params modifier C#使用 ref 或 out 修饰符和 params 修饰符 C#
【发布时间】:2022-06-16 09:56:01
【问题描述】:

我在这里有以下代码,我知道这不会编译,因为我试图将 ref 修饰符与 params 修饰符一起使用:

public static int[] Findfactors(ref params int[] pro) {

    int[] hjk = { 88, 99 };
    pro = hjk;
    return pro;
}

我只是想让“pro”指向“hjk”,但我做不到。 为什么 C# 不允许我们这样做?为什么我不能将 ref 或 out 与参数一起使用?

我的最佳猜测如下:

params 有一个属性,它允许您不将任何参数传递给具有 params 修饰符等的参数,

以这种情况为例,如果我不将任何参数传递给“pro”,然后尝试让 pro 指向“hjk”,那么我实际上会让“Nothing”指向显然没有任何意义的东西.

【问题讨论】:

  • params 是一个仅输入的概念。 ref 可能会修改调用者从未见过的临时局部变量(由编译器生成)。为什么要这样做?
  • 你的标题是“ref or out”,那么为什么不直接使用out呢?您也不能将它与params 一起使用,但您可以为其添加第二个参数。 Findfactors(out int[] values, params int[] pro)。在这种情况下,我个人认为没有理由使用其中任何一个。我会摆脱 ref 并像你正在做的那样返回值。
  • params 背后的目的是允许您从调用函数传递任意数量的参数。如果您要传递一个整数数组,那么您不需要包含 params 标记。如果要修改现有的整数数组,请将其保留为 ref,否则在方法中创建一个新数组并使用 out 标记
  • 您也不能重新分配 ref 值,函数会返回原始指针,并且您的重新分配会在函数内丢失

标签: c#


【解决方案1】:

让我们试着思考一下为什么这个功能不起作用。

从一个可以工作的程序开始:

void Main()
{
    int x = 1;
    Console.WriteLine(Calc(ref x));
    Console.WriteLine(x);
}

public int Calc(ref int x)
{
    x = 42;
    return x + x;
}

这会输出以下内容:

84
42

现在让我们假设ref params 组合有效。我也许可以这样写:

void Main()
{
    int x = 1;
    int y = 2;
    Console.WriteLine(Calc(ref x, ref y));
    Console.WriteLine(x);
    Console.WriteLine(y);
}

public int Calc(ref params int[] z)
{
    z = new int[] { 2, 3, };
    return z.Sum();
}

z 的赋值会导致将 23 的值分别分配回 xy,这似乎是合理的。

但是,没有什么能阻止我写以下任何内容:

    z = new int[] { };
    z = new int[] { 2, };
    z = new int[] { 2, 3, 4, };

所有这些都会导致xy 的分配不起作用。

因此此功能无法使用。

使这项工作的唯一方法是确保您有两个值并且只有两个值,如果您希望在单个变量中使用它,那么您必须使用元组。

方法如下:

void Main()
{
    (int x, int y) z = (1, 2);
    Console.WriteLine(Calc(ref z));
    Console.WriteLine(z.x);
    Console.WriteLine(z.y);
}

public int Calc(ref (int x, int y) z)
{
    z = (2, 3);
    return z.x + z.y;
}

【讨论】:

    猜你喜欢
    • 2012-08-26
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2014-05-13
    • 2015-04-29
    • 2011-08-15
    • 2021-11-06
    相关资源
    最近更新 更多