按值传递ref参数并将其设置为null

时间:2011-05-24 12:06:22

标签: reference ref

考虑以下代码片段

Form form2 = new Form();

  test(form2);
  form2.Show();

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

由于f还包含对Form2的“另一个”引用,因此将f设置为null也应将Form2设置为null,而不是。需要一个很好的解释来理解这一点。

2 个答案:

答案 0 :(得分:1)

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

这里传递的值可以看作是一个内存地址(这与虚拟机不完全相同,但它是一个有用且充分的比喻)。

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

如果您使用存储在变量中的地址来访问和更改地址所引用的实际Object,则情况会有很大差异。您正在更改此处的实际内容,因此在您的局部变量超出范围后,所有更改都将保留。

再退一步:

您可以将变量视为一张纸条,其中包含朋友的地址(您的对象)。 如果您刻录纸张(将变量设置为空),您的朋友不会受到影响。 如果你使用纸张访问地址并给你的朋友一个礼物或打他的脸(在变量背后的对象上调用一个方法),他肯定会受到影响,你必须承担后果

答案 1 :(得分:0)

(我假设这是Java。)

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