C# 将数组作为参数传递

C# 将数组作为参数传递,c#,arrays,arguments,parameter-passing,C#,Arrays,Arguments,Parameter Passing,如果我们修改在方法中作为参数传递的数组的内容,那么修改是在参数的副本上完成的,而不是在原始参数上,因此结果是不可见的 当我们调用具有引用类型参数的方法时,会发生什么过程 这是我想问的问题的代码示例 using System; namespace Value_Refrence_Type { class Program { public static void Main() { int[] callingarray

如果我们修改在方法中作为参数传递的数组的内容,那么修改是在参数的副本上完成的,而不是在原始参数上,因此结果是不可见的

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

这是我想问的问题的代码示例

      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);
        }

    }
}

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

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


这里所指的行为是针对类型,而不是引用类型。C#中的值类型是
struct
s和
enum
s,而C#中的引用类型是
class
es和数组。

No,这是不正确的

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


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

这里有许多答案和描述。我试着举个例子。假设这是您的方法:

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#中通过copy传递,但复制的是变量

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

public void ProcessData(int[] data)
{
  data = null;
}
它不会将您的
dataToProcess
设置为null。这意味着:


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

c#中的数组可以作为参数传递给方法参数。由于数组是引用类型,因此该方法可以更改元素的值。有关详细信息,请参阅msdn doc。

@nicomp数组或任何其他对象都不是通过引用传递的。默认情况下,C#中的所有对象都按值传递。要通过引用传递,您需要使用
ref
out
关键字。您似乎将引用类型与参数传递混淆了。@nicomp同样,您将按值传递的引用类型的行为与按引用传递参数混淆了。当通过引用传递时,您可以为参数分配一个新数组,它将在调用站点更改变量,这显然不是我们正在讨论的代码中的情况。同样,通过引用传递参数非常简单,您需要使用提供的关键字
ref
out
,否则将通过值传递参数。如果你仍然不相信,我建议你阅读C#规范的相关部分。@nicomp有趣的是,你指出了我自己的答案。我知道你不相信,所以我在这里引用:“(…)要通过引用传递参数,请使用ref或out关键字。(…)@nicomp不,我看到一个参数通过值传递,这意味着变量被复制。因为变量持有引用类型,所以复制引用并将其指向同一对象。但这并不是通过引用传递参数。通过引用传递参数需要使用
ref
关键字,它允许您在调用站点更改原始变量的值,也就是说,我可以说
a=null
,在调用站点,当方法返回时,变量将
null
。在您的示例中尝试一下,看看它是如何工作的。再次,请阅读我先前回答中的链接。@RobertHarvey这在真正了解幕后发生的事情的人之间的对话中不是太成问题,但对于那些不了解实际发生的事情的人,比如nicomp,这会创建一个严重错误的心理模型,这会导致程序的行为不符合他们的预期,因为他们认为自己在通过引用传递值,而实际情况并非如此。如果按值传递引用和按引用传递值实际上具有相同的语义,那么区分它们并不重要,但它们没有相同的行为在方法声明中,当我调用该方法时,该值不可见,相反,它显示了在方法声明中更改之前的数组值。@MohammadAdil,因为您正在更改原始引用的副本。如果您想更改原始变量所指向的内容,则需要通过引用传递参数。那么图像(书籍)中的行要解释的内容是否错误?@MohammadAdil No.修改数组的元素,
a[1]=1
将保持不变,因为参数指向原始变量所在的同一对象。但是,执行以下
a=new[]{…}
操作将不会持续,因为您正在为原始变量的副本分配一个新引用。原始变量或它指向的数组不知道也不关心您刚刚将一个新数组分配给该变量的副本。正如我在问题中所解释的,数组也会发生同样的情况。如果我在方法声明中进行更改,则调用该方法时不会显示结果。在c#arg中