5

我一直在努力理解我必须了解的测试方法发生了什么,我很难弄清楚我得到结果的原因,任何关于“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] 作为值,当该方法将 5 添加到位置 1(即 2)的元素时,我得到 [1, 7] 作为结果,当方法结束,我的程序以某种方式返回到主程序,并且 bx 两者现在都是 [1, 7],这是怎么发生的?,我认为该方法只是在修改 by,因为这是通过的方法。此外,g 函数不会添加任何内容,因为“a”值是在方法结束时“死亡”的局部变量,对吧?我希望有人能帮助我,我必须通过这个测试!谢谢 ;]

4

3 回答 3

2

开始了:

  • 一个名为的新变量b被初始化为A.
  • 创建b时,它将值设置b.x{1, 2}
  • b.y然后分配给b.x,但是,因为它们是数组,所以它们现在引用相同的数据。
  • b.f被调用,并且已经b.y传递给它(记住,那个b.yb.x现在正在引用相同的数据)。f本质上,z 在函数期间也指向相同的数据。
  • b.f将 5 添加到共享数据的索引 1 处的值,即 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方法是正确的,因为该变量是本地的并且不执行任何操作。

希望有帮助。

于 2012-11-22T02:21:54.057 回答
1
b.y = b.x;

这行代码仅将变量中保存的引用复制xy变量中。所以这两个变量都引用了同一个数组。因此,您只有一个数组和两个引用它的变量。

public void g(){...}

此方法创建一个新元素,对其进行处理但不将其存储在任何地方,因此在方法返回后它会丢失(上面没有引用,它已准备好被垃圾收集)。

在此处输入图像描述

尝试阅读价值与参考

于 2012-11-22T02:17:38.987 回答
1

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

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

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

一般来说,在 .NET/C# 文档中,具有标识的值称为引用类型。.NET 的值类型是一种具有复制语义的“纯值”。但是值类型可以包含具有标识的值,而引用类型可以有意地遵守纯度,所以它不一定那么简单。

于 2012-11-22T02:35:51.977 回答