将数组作为参数传递

时间:2016-05-28 11:55:45

标签: c# arrays arguments parameter-passing

如果我们修改在方法中作为参数传递的数组的内容,则对参数的副本而不是原始参数进行修改,因此结果不可见。

当我们调用具有引用类型参数的方法时会发生什么过程?

以下是我想问的代码示例

      using System;

namespace Value_Refrence_Type
{
    class Program
    {
        public static void Main()
        {
            int[] callingarray = { 22, 200, 25485 };
            abc(callingarray);
            Console.WriteLine("This is callingarray");
            foreach (int element in callingarray)
                Console.WriteLine(element);
        }



        //method parameter
        static void abc(int[] calledarray)
        {
            Console.WriteLine("Method Called--------");
            foreach (int element in calledarray)
                Console.WriteLine(element);

            //Here on changing the value of elements of calledarray does't afftect the value of element of callingarray
            //if both refrences to same memory location then the value needs to change, which is not happening here
            calledarray = new int[] {55, 54, 65};
            foreach (int element in calledarray)
                Console.WriteLine(element);
        }

    }
}

4 个答案:

答案 0 :(得分:7)

不,这不正确。

默认情况下,参数在C#中按值传递,这意味着您将获得变量的副本。但重要的是要意识到复制的只是变量,不一定是对象;如果变量包含引用类型(例如数组),那么变量实际上只是一个"指针"到对象所在的内存地址。因此,当您将所述变量传递给方法调用时,引用将被复制为yes,但它仍然指向原始变量引用的完全相同的对象。

当参数是值类型时,情况就大不相同了。在这种情况下,变量本身会保留对象,因此您可以获得您似乎期望的行为。

答案 1 :(得分:6)

以下是许多答案和描述。我试着举个例子。让我们说这是你的方法:

public void ProcessData(int[] data)
{
  data[0] = 999;
}

如果您按这样调用方法:

int[] dataToProcess = new int[] {1, 2, 3};
ProcessData(dataToProcess);
Console.WriteLine(dataToProcess[0]); //returns 999;

它将返回999因为ProcessData访问数组的内存。

像@InBetween描述的那样:

  

默认情况下,在C#中通过副本传递参数,但复制的是变量

这意味着,如果将方法中的数据设置为null:

public void ProcessData(int[] data)
{
  data = null;
}

它不会将您的dataToProcess设置为null。这意味着:

您正在将指向阵列内存的指针副本传递给方法。

答案 2 :(得分:1)

数组是C#中的引用类型。这意味着每次将数组作为参数传递给任何函数时,参数的引用(或指针)都会传递给函数。因此,您对函数中的数组所做的任何修改也都是在实际参数中进行的。

  

如果我们修改作为参数传递的数组的内容   方法修改是在参数的副本而不是   原始论证因此结果不可见。

您在此处引用的行为适用于类型而非引用类型。 C#中的值类型是structenum s,C#中的引用类型是class es和数组。

答案 3 :(得分:1)

c#中的数组可以作为方法参数的参数传递。因为数组是引用类型,所以该方法可以更改元素的值。为了进一步,您应该注意this msdn doc。