【发布时间】: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