考慮下面的代碼片斷通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