2011-05-24 43 views
1

考虑下面的代码片断通ref参数由值,并将其设置为null

Form form2 = new Form(); 

    test(form2); 
    form2.Show(); 

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

因为f也保持“另一个”参考到窗体2,设置F为null应该设置窗体2为null为好,它没有。需要一个很好的解释来理解这一点。

+0

标题中提及的“ref”在哪里? – khachik 2011-05-24 12:10:13

回答

1

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

通过这里传递的值可以看作是一个内存地址(这不是虚拟机的情况,但它是一个有用的和足够的隐喻)。

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

如果您使用存储在变量中的地址来访问并更改地址引用的实际对象,则情况会非常不同。你在这里改变真实的东西,所以所有的改变在你的本地变量超出范围之后仍然存在。

要多走一步回:

你可以看到变量的纸和一个朋友(你的对象)的地址一溜。 如果您刻录纸张(将变量设置为空),您的朋友不受影响。 如果您使用纸张来访问地址,并给您的朋友一个礼物或拍击他的脸(在变量后面的对象上调用方法),他肯定会受到影响,您必须忍受后果

+0

同意,那么为什么设置f.Text =“Form2”;反映在主要功能 – Rauld 2011-05-25 11:58:13

+0

@Rauld - 更新了答案和进一步解释,希望它使问题更清晰 – kostja 2011-05-25 12:40:58

+0

谢谢,现在有道理 – Rauld 2011-05-26 06:55:56

0

(我假设这是Java。)

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

+0

同意,那么为什么设置f.Text =“Form2”;体现在主要功能上。 – Rauld 2011-05-25 11:57:28

相关问题