2017-02-21 6 views
1

У меня есть следующий тестовый код, я обновляю m_ClientTreeView, позвонив по телефону createTreeView(TreeView tree), передав его. Но даже treeview - тип refrence, это изменение не отражается. Я проверил с ref, и он работает правильно.Проблема с обновлением элемента 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

Я имею в виду, когда я проверил objCGUI.m_ClientTreeView после вызова createTreeView, он все еще держит нулевое значение –

+0

Это потому, что вы не внесли никаких изменений в 'm_ClientTreeView'. Если вы хотите присвоить ему новое значение, передайте его как 'ref'. –

ответ

2

Хотя TreeView является ссылочным типом, но это не означает, вы можете изменить его ссылку, когда передаете его методу.

Когда вы передаете ссылочный тип методу, вы можете изменить его элементы, но вы не можете изменить ссылку объекта. Чтобы изменить ссылку объекта, вам нужно использовать ключевое слово 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: Вот отличная статья Джозефа Альбахари о ссылочном типе и типе значения. Это, вероятно, будет решить большинство ваших проблем, о концепции:

Смежные вопросы