2011-05-24 23 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

相關問題