我有以下测试代码,我通过传递m_ClientTreeView
方法来更新createTreeView(TreeView tree)
。但是即使是树形视图也是一种参考类型,这种变化并没有反映出来。我检查了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;
}
}
可能是什么原因?
答案 0 :(得分: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关于引用类型和值类型的精彩文章。它可能会解决您关于这个概念的大部分问题: