1

考虑以下代码片段

Form form2 = new Form();

  test(form2);
  form2.Show();

public void test(Form f)
{
  f = null;
}

由于 f 还持有对 Form2 的“另一个”引用,因此将 f 设置为 null 也应该将 Form2 设置为 null,但事实并非如此。需要一个很好的解释来理解这一点。

4

2 回答 2

1

设置为的引用null是引用的本地副本form2。由于引用是按值传递的,这意味着制作一个精确的副本并传递副本,原件保持不变。

此处传递的值可以视为内存地址(VM 并非完全如此,但它是一个有用且充分的比喻)。

在测试方法中,您将保存此地址副本的变量设置为null. 这没有任何进一步的后果。

如果您使用存储在变量中的地址来访问和更改地址所指的实际对象,情况就大不相同了。您在这里更改的是真实的东西,因此在您的局部变量超出范围后所有更改都将保留。

再退一步:

您可以将变量视为带有朋友(您的对象)地址的纸条。如果你烧纸(设置变量为null),你的朋友不受影响。如果你用论文访问地址,给你的朋友礼物或者打他的脸(在变量后面的对象上调用一个方法),他肯定会受到影响,你必须承受后果

于 2011-05-24T12:10:31.043 回答
0

(我假设这是Java。)

方法参数总是按值传递。这意味着它们的内容总是被复制到一个新变量中。在这种情况下f,包含对对象的引用的变量的内容被复制到一个新变量中。当新变量的内容被替换为 时null,原始变量的内容不受影响——它们仍然指向原始对象。

于 2011-05-24T12:09:54.753 回答