如果我们修改在方法中作为参数传递的数组的内容,则对参数的副本而不是原始参数进行修改,因此结果不可见。
当我们调用具有引用类型参数的方法时会发生什么过程?
以下是我想问的代码示例
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);
}
}
}
答案 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#中的值类型是struct
和enum
s,C#中的引用类型是class
es和数组。
答案 3 :(得分:1)
c#中的数组可以作为方法参数的参数传递。因为数组是引用类型,所以该方法可以更改元素的值。为了进一步,您应该注意this msdn doc。