我一直在努力去理解我的测试中必须理解的方法是什么,我很难弄清楚我得到的结果是什么原因,对如何得到的解释“f”方法非常受欢迎
class Program {
static void Main(string[] args)
{
A b = new A(); b.y = b.x;
b.f(b.y); b.g();
Console.WriteLine(b.x[0] + " " + b.x[1]); // Prints 1 7
Console.WriteLine(b.y[0] + " " + (b.x[1] + b.y[1])); // 1 14
}
}
public class A {
public int[] x = {1, 2};
public int[] y;
public void f(int[] z)
{
z[1] += 5;
}
public void g()
{
A a = new A ();
a.x[0]++;
a.x[1]--;
}
}
让我解释一下我理解的内容,通过创建数组并获取bx中的值,现在,当我们调用bf时,我们传递的方法是[1,2],现在,这里是我被卡住了,z似乎是by数组,因此它有[1,2]作为值,当方法在位置1(即2)的元素中加5时,我得到[1,7]作为结果那个,当方法结束并且我的程序回到main时,不知何故,由AND Bx BOTH现在[1,7],这是怎么发生的?我认为这个方法只是修改了因为那是通过的那个。此外,g函数不会添加任何内容,因为“a”值是一个局部变量,当方法结束时“死”,对吧?我希望有人可以帮助我,我必须通过这个测试!谢谢;]
答案 0 :(得分:2)
我们走了:
b
的新变量初始化为A
。b
时,会将b.x
的值设置为{1, 2}
。b.y
分配给b.x
,但由于它们是数组,因此它们现在引用相同的数据。b.f
被调用,并且传递了b.y
(记住,b.y
和b.x
现在引用相同的数据)。实质上,z在f
函数期间也指向相同的数据。b.f
将共享数据的索引1处的值加5,即2。所以2 + 5 = 7. Console.WriteLine
打印b.x[0]
仍为1.然后打印b.x[1]
,现在为7(如上所述)。Console.WriteLine
打印b.y[0]
,它仍为1(因为它们共享相同的数据)。然后打印b.x[1]
+ b.y[1]
。它们共享相同的数据..索引1的数据是7. 7 + 7 = 14. 你对g
方法的看法是正确的,因为变量是本地的,并没有做任何事情。
希望有所帮助。
答案 1 :(得分:1)
b.y = b.x;
此行代码仅将x
变量中保存的引用复制到y
变量。因此两个变量都引用同一个数组。所以,你只有一个数组和两个引用它的变量。
public void g(){...}
此方法创建一个新元素,对其执行某些操作但不将其存储在任何位置,因此在方法返回后丢失(没有对它的引用,它已准备好进行垃圾回收)。
答案 2 :(得分:1)
你只是对编程语言中所谓的“身份”感到困惑。作为一种简单的观点,编程语言中有两类值:纯值和带有标识的值。
纯值可能意味着一些不同的东西,但基本上它们都遵循您期望的行为,即。每个子程序都得到一个数组X的“副本”,它与给定X的所有其他子程序隔离。
具有标识的值不符合上述复制行为。实例X在传递X的所有子程序之间共享。这意味着所有子程序都会看到所有其他子程序所做的更改。
一般来说,在.NET / C#文档中,带有标识的值称为引用类型。 .NET的值类型是一种具有复制语义的“纯值”。但是值类型可以包含具有标识的值,并且引用类型可以有意识地遵循纯度,因此它不一定非常简单。