C# 通过引用和通过值C传递

C# 通过引用和通过值C传递,c#,pass-by-reference,pass-by-value,C#,Pass By Reference,Pass By Value,这是在扰乱我的思想,我已经试着把我的头围绕着它好几年了。我在这里问了几个问题,但我还是不明白。我访问过Jon Skeet的页面等。我尝试编写自己的代码,看看我是否理解这个概念,但对于下面的代码,当我尝试打印nums[0]时,它给了我500,它不应该打印出1,因为数组应该按值传递,因为C默认按值传递 更新:aThing只是随机更改索引,以查看r中的更改是否反映在NUM中 static void Main(string[] args) { int[] nums = new i

这是在扰乱我的思想,我已经试着把我的头围绕着它好几年了。我在这里问了几个问题,但我还是不明白。我访问过Jon Skeet的页面等。我尝试编写自己的代码,看看我是否理解这个概念,但对于下面的代码,当我尝试打印nums[0]时,它给了我500,它不应该打印出1,因为数组应该按值传递,因为C默认按值传递

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

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(nums.ToArray()); // copy the array before passing it

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