C#混淆方法

时间:2012-11-22 02:11:05

标签: c# arrays testing

我一直在努力去理解我的测试中必须理解的方法是什么,我很难弄清楚我得到的结果是什么原因,对如何得到的解释“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”值是一个局部变量,当方法结束时“死”,对吧?我希望有人可以帮助我,我必须通过这个测试!谢谢;]

3 个答案:

答案 0 :(得分:2)

我们走了:

  • 名为b的新变量初始化为A
  • 创建b时,会将b.x的值设置为{1, 2}
  • 然后将
  • b.y分配给b.x,但由于它们是数组,因此它们现在引用相同的数据。
  • b.f被调用,并且传递了b.y(记住,b.yb.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(){...}

此方法创建一个新元素,对其执行某些操作但不将其存储在任何位置,因此在方法返回后丢失(没有对它的引用,它已准备好进行垃圾回收)。

enter image description here

尝试阅读Value vs Reference

答案 2 :(得分:1)

你只是对编程语言中所谓的“身份”感到困惑。作为一种简单的观点,编程语言中有两类值:纯值和带有标识的值。

纯值可能意味着一些不同的东西,但基本上它们都遵循您期望的行为,即。每个子程序都得到一个数组X的“副本”,它与给定X的所有其他子程序隔离。

具有标识的值不符合上述复制行为。实例X在传递X的所有子程序之间共享。这意味着所有子程序都会看到所有其他子程序所做的更改。

一般来说,在.NET / C#文档中,带有标识的值称为引用类型。 .NET的值类型是一种具有复制语义的“纯值”。但是值类型可以包含具有标识的值,并且引用类型可以有意识地遵循纯度,因此它不一定非常简单。