【问题标题】:Difference in code? c# passing an argument by reference代码的区别? c# 通过引用传递参数
【发布时间】:2019-11-08 07:30:35
【问题描述】:

只是想看看是否有人可以帮助我理解这一点:

下面这两个例子在用法上有什么区别?第二个什么时候通过引用传递参数更好?两者都输出相同的结果。

public static void Sqr(int x)
{
    x = x * x;
    Console.WriteLine(x);
}

static void Main(string[] args)
{
    Sqr(3);
}

2)

public static void Sqr(ref int x)
{
    x = x * x;
}

static void Main(string[] args)
{
    int a = 3;
    Sqr(ref a);
    Console.WriteLine(a);
}

有人知道吗?我在这里一无所知。我的问题是,我什至不知道为什么事情是这样写的!!有什么见解吗?

【问题讨论】:

  • 这能回答你的问题吗? Why use the 'ref' keyword when passing an object?
  • 有趣的实验:在Main的第二个实现中尝试Sqr的第一个实现(你需要在Sqr(ref a)的调用中删除ref)。保持其他一切完全相同。运行。应该有两行的输出。第一个来自Sqr 方法内部,第二个来自Main 方法内部,调用Sqr 之后。比较这两个输出并说明为什么它们是这样的。尤其是与仅第二个实现相比时。

标签: c# methods parameter-passing


【解决方案1】:

两者输出相同的结果。

这是因为除了更改它是否为 ref 参数外,您还更改了获取输出的位置。

这是您的第一段代码的一个版本,它更接近于第二段代码,因此它们在是否为 ref 参数方面有所不同:

public static void Sqr(int x)
{
    x = x * x;
}

static void Main(string[] args)
{
    int a = 3;
    Sqr(a);
    Console.WriteLine(a);
}

现在输出将为 3,因为 a 的值没有改变 - 它的 已传递给 Sqr 方法。在您的第二个示例中,变量本身是通过引用传递的,因此Sqr 方法中的xMain 方法中的a 引用相同的存储位置...在方法返回后,可以通过a“看到”对x 的值的更改。

第二个什么时候通过引用传递参数更好?

当您希望参数的更改反映在参数中时。这相对很少见,我鼓励您默认使用值参数。例如,将Sqr 写为:

public static int Sqr(int x)
{
    return x * x;
}

然后称它为:

a = Sqr(a);

ref 参数相对根据我的经验很少有用 - 但了解它们的工作原理很重要。 (您可能会发现我的article on parameter passing 对更多详细信息很有用。)

【讨论】:

  • 感谢 Jon 的详细回答。我认为您的答案是按值传递方法? (真的不知道技术上发生了什么)在你的例子中,如果不使用 x= x* x 有什么意义?
  • @YoshiOnimusha:根本没有传递方法。我的观点是,第一种方法 毫无意义,正是因为参数是按值传递的......而且你可以看到,当你让两个例子在它们的方式上相似时,它没有任何效果重新打印结果。
猜你喜欢
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2012-01-04
  • 2016-05-13
  • 2010-10-07
  • 1970-01-01
相关资源
最近更新 更多