2017-02-21 62 views
1

我有以下測試代碼,我通過傳遞它來調用createTreeView(TreeView tree)方法更新m_ClientTreeView。但即使是樹形視圖是一種引用類型,變化也不會反射回來。我檢查與裁判,它工作正常。Treeview項目更新作爲參數傳遞時出現

namespace TestRefType 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
     InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
     ClientGUI objCGUI = new ClientGUI(); 
     createTreeView(objCGUI.m_ClientTreeView); 
     //createTreeView(ref objCGUI.m_ClientTreeView); 

     objCGUI.m_ClientTreeView.Dock = DockStyle.Fill; 
     } 

    private void createTreeView(TreeView tree) 
    { 
     tree = new TreeView(); 
     tree.Visible = false; 
    } 
} 

    public struct ClientGUI 
    { 
    public System.Windows.Forms.TreeView m_ClientTreeView; 
    } 
} 

可能是什麼原因?

+0

你不能指望看到'你在代碼中創建TreeView'。目前它還沒有被添加到任何形式。它只是一個內存中的對象,它是'ClientGUI'結構的成員。 –

+0

我的意思是,當我在調用createTreeView之後檢查objCGUI.m_ClientTreeView時,它仍然保留空值 –

+0

這是因爲您沒有對'm_ClientTreeView'執行任何更改。如果你想給它賦一個新值,把它作爲'ref'傳遞。 –

回答

2

儘管TreeView是參考類型,但並不意味着您可以在將其傳遞給方法時更改其引用。

將引用類型傳遞給方法時,可以更改其成員,但不能更改對象的引用。要更改對象的引用,您需要在方法簽名中以及將實例傳遞給方法時使用ref關鍵字。

如果不使用ref,當您將objCGUI.m_ClientTreeView轉換爲createTreeView(TreeView tree)時,方法中tree只是一個變量,指向TreeView。您可以訪問和更改tree.SomeProperty,但是如果您說tree = new TreeView(),那麼您剛剛在方法範圍內指出tree變量指向新的TreeView。在方法之外,objCGUI.m_ClientTreeView包含在傳遞給方法之前的值。

這裏是你做了什麼,一個真正簡化的例子:

TreeView t1 = null; 
TreeView t2 = t1; 
t2 = new TreeView(); 

你從現在t1有什麼期望?

注1:在結構中使用引用類型時,在使用結構時應該小心。儘管結構是值類型的,但是在複製時,它們的引用類型不會複製並在該結構的不同實例之間保留相同的引用,例如,如果將節點添加到複製結構的TreeView,則該節點也將被添加到你的結構的第一個例子。

注2:這是Joseph Albahari關於引用類型和值類型的一篇很棒的文章。它可能會解決大部分的問題,你對這個概念: