【发布时间】:2017-08-10 16:00:20
【问题描述】:
按 val 变量:
static void Main(string[] args)
{
int i = 3;
method1(i);
Console.WriteLine(i);
Console.ReadLine();
}
static void method1(int z)
{
z *= 2;
}
输出为 3,因为 method1 没有更改 Main 中的变量。
参考变量:
static void Main(string[] args)
{
int i = 3;
method1(ref i);
Console.WriteLine(i);
Console.ReadLine();
}
static void method1(ref int z)
{
z *= 2;
}
输出为 6,因为 method1 更改了 Main 中的变量。
按 val 排列:
class Program
{
static void Main(string[] args)
{
int[] i = { 13, 1, 5 };
method1(i);
Console.WriteLine(String.Join(",",i));
Console.ReadLine();
}
static void method1(int[] z)
{
for(int m=0; m<z.Length;m++)
{
z[m] *= 2;
}
}
}
输出为 26、2、10。
引用数组:
class Program
{
static void Main(string[] args)
{
int[] i = { 13, 1, 5 };
method1(ref i);
Console.WriteLine(String.Join(",",i));
Console.ReadLine();
}
static void method1(ref int[] z)
{
for(int m=0; m<z.Length;m++)
{
z[m] *= 2;
}
}
}
输出又是 26、2、10。
结论: 变量可以通过值或引用传递, 与只能通过引用传递的数组相反。 这是正确的吗? 如果不是 - method1(ref int[] z) 和 method1(int[] z) 有什么区别?我们预计什么时候会得到不同的结果?
【问题讨论】:
-
尝试在方法中执行
z = new int[10];之类的操作,您会看到 -
有引用类型和值类型。然后是按值传递和按引用传递。现在将这些相乘得到 4 个组合。 :)
-
您可能会感到困惑的是,您在这 4 种情况下都传递了一个 变量。第一个变量的类型为
int(值类型),第二个变量的类型为int[](引用类型)。因此,在第一种情况下,您传递的是int变量的值(一个数字),然后是对int变量的引用(它允许您更改原始变量的值)。在第三种情况下,您再次传递了int[]变量的值(对数组内存中某处的引用) - 这仍然不能让您更改 变量i,只有数组的内容。 -
如果您了解 C 指针,您可以将其与具有本地
int变量并将其作为 1)int(int 值)、2)int*传递给函数进行比较(指向位于堆栈上的int值的指针); 在第二种情况下有一个本地int*变量并将其作为 3)int*(指向堆上的int值的指针)和 4)@ 987654339@(指向本地int*变量的指针)。
标签: c# arrays pass-by-reference