考虑下面的代码片断通ref参数由值,并将其设置为null
Form form2 = new Form();
test(form2);
form2.Show();
public void test(Form f)
{
f = null;
}
因为f也保持“另一个”参考到窗体2,设置F为null应该设置窗体2为null为好,它没有。需要一个很好的解释来理解这一点。
考虑下面的代码片断通ref参数由值,并将其设置为null
Form form2 = new Form();
test(form2);
form2.Show();
public void test(Form f)
{
f = null;
}
因为f也保持“另一个”参考到窗体2,设置F为null应该设置窗体2为null为好,它没有。需要一个很好的解释来理解这一点。
设置为null
的参考是form2
参考的本地副本。由于引用是按值传递的,意思是作出精确的副本并传递副本,原始文件保持不变。
通过这里传递的值可以看作是一个内存地址(这不是虚拟机的情况,但它是一个有用的和足够的隐喻)。
在测试方法中,您将一个保存该地址副本的变量设置为null
。这没有任何进一步的后果。
如果您使用存储在变量中的地址来访问并更改地址引用的实际对象,则情况会非常不同。你在这里改变真实的东西,所以所有的改变在你的本地变量超出范围之后仍然存在。
要多走一步回:
你可以看到变量的纸和一个朋友(你的对象)的地址一溜。 如果您刻录纸张(将变量设置为空),您的朋友不受影响。 如果您使用纸张来访问地址,并给您的朋友一个礼物或拍击他的脸(在变量后面的对象上调用方法),他肯定会受到影响,您必须忍受后果
(我假设这是Java。)
方法参数总是按值传递。这意味着他们的内容总是被复制到一个新的变量。在这种情况下,变量f
的内容(包含对象的引用)被复制到新变量。当新变量的内容被替换为null
时,原始变量的内容不受影响 - 它们仍指向原始对象。
同意,那么为什么设置f.Text =“Form2”;体现在主要功能上。 – Rauld 2011-05-25 11:57:28
标题中提及的“ref”在哪里? – khachik 2011-05-24 12:10:13