C# 作为参数传递时出现Treeview项更新问题

C# 作为参数传递时出现Treeview项更新问题,c#,.net,winforms,treeview,C#,.net,Winforms,Treeview,我有以下测试代码,我正在通过调用createTreeView(TreeView树)方法来更新m_ClientTreeView。但即使treeview是一种引用类型,这种变化也没有反映出来。我检查了ref,它工作正常 namespace TestRefType { public partial class Form1 : Form { public Form1() { InitializeComponent(); }

我有以下测试代码,我正在通过调用
createTreeView(TreeView树)
方法来更新
m_ClientTreeView
。但即使treeview是一种引用类型,这种变化也没有反映出来。我检查了ref,它工作正常

 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;
  }
}

原因可能是什么?

尽管
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关于引用类型和值类型的一篇伟大文章。它可能会解决您关于该概念的大部分问题:


您不能期望看到您在代码中创建的
TreeView
。目前它还没有被添加到任何表单中。它只是一个内存中的对象,是
ClientGUI
结构的成员。我的意思是,在调用createTreeView后检查objCGUI.m_ClientTreeView时,它仍然保持空值,这是因为您没有对
m_ClientTreeView
执行任何更改。如果要为其指定新值,请将其作为
ref
传递。