【问题标题】:Pass by reference and Pass by value C# [duplicate]按引用传递和按值传递C# [重复]
【发布时间】:2023-03-07 21:35:01
【问题描述】:

这让我心烦意乱,多年来我一直在努力解决它。我在这里遇到了几个问题,但我仍然不明白。我访问过 Jon Skeet 的页面等。我尝试编写自己的代码以查看我是否理解这个概念,但是对于下面的代码,当我尝试打印出 nums[0] 时它给了我 500,不应该打印出 1因为数组应该是按值传递的,因为“C#默认按值传递”?

更新:aThing 只是随机更改索引以查看 r 中的更改是否反映在 nums 中

static void Main(string[] args)
    {
        int[] nums = new int[] { 1, 2, 3, 4 };

        aThing(nums);

        Console.WriteLine(nums[0]);
        Console.ReadLine();
    }

    static void aThing(int[] r)
    {
        r[0] = 500;
        r = null;
    }

只是为了兴趣,我如何在不修改 numbs 的情况下修改 r ?

【问题讨论】:

  • 你想在 aThing() 中做什么?
  • 将数组的副本传递给 aThing。例如,nums.ToArray()
  • 只是随机更改一个索引,看看 r 的变化是否反映在 nums 中
  • 在 C# 中,参数可以通过值或引用传递给参数。通过引用传递使函数成员、方法、属性、索引器、运算符和构造函数能够更改参数的值,并使该更改在调用环境中持续存在。要通过引用传递参数,请使用 ref 或 out 关键字。引用类型,数组就是这样一种类型,总是传递引用,而不是通过引用。因此,虽然您可以安全地更改任何数组元素,但通过分配一个新元素来更改整个数组是行不通的。
  • 不要将引用传递与引用类型混淆。 nums 是按值传递的,这意味着它是与 r 不同的变量,但 nums 和 r 都引用同一个数组。当您说 r = null 时,r 将不再引用该数组,但 nums 会。如果您通过引用传递它,则 nums 也将为空,因为 r 和 nums 将是相同的变量。

标签: c# pass-by-reference pass-by-value


【解决方案1】:

通过复制。

一个解决方案是这样调用你的方法:

aThing(nums.ToArray()); // copy the array before passing it

【讨论】:

  • 成功了,谢谢 :D
猜你喜欢
  • 2013-12-02
  • 2012-07-29
  • 1970-01-01
  • 2011-05-29
  • 2019-05-07
  • 2012-03-12
  • 2013-09-15
  • 2014-08-23
  • 2015-05-23
相关资源
最近更新 更多