VB.NET Проблемы с классами

#vb.net

#vb.net

Вопрос:

У меня есть форма, которая содержит объект «TextBox1» (элемент управления TextBox1)

В разделе кода я инициализировал новый объект текстового поля, которого нет в форме, подобной этой:

   Dim aa As New TextBox
  aa = TextBox1 'THE CONTROL ON THE FORM
  aa.Text = "hi how are you?"
 

Текстовое поле 1 в форме теперь изменено, в нем написано «привет, как дела?»

разве объект «aa» и «TextBox1» не должны быть отделены друг от друга? означает, что изменение одного объекта не повлияет на другой?

Почему это происходит? И как это предотвратить?

Означает отделение объектов друг от друга.

Написание кода в этой форме

 Public Sub blah(ByVal aa As TextBox)
    aa.Text = "hi how are you?"
End Sub
 

А затем вызываю подлодку по

     blah(TextBox1)
 

Это не решает проблему.

Комментарии:

1. Я думаю, что главный вопрос заключается в том, зачем вам нужен скрытый клон TextBox1? Почему не просто строковая переменная текста?

2. Мне это нужно для многопоточности

Ответ №1:

Объекты .Net передаются по ссылке.
aa и TextBox1 оба ссылаются на один и тот же TextBox экземпляр.

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

Комментарии:

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

Ответ №2:

Когда вы устанавливаете объект, равный другому, в данном случае aa to TextBox1 , aa теперь является указателем на TextBox1 , и любые действия, выполняемые с ним, будут влиять на оба.

Способ использовать его как просто значение — использовать экземпляр в функции. Как таковой.

 Public Sub process(ByVal aa as Object)

'do stuff
End Sub
 

Комментарии:

1. Я хочу отделить объекты один от другого

2. Создание отдельной функции позволило бы вам передавать ее как ByVal, который не является указателем.

3. Этого не должно быть. Можете ли вы обновить начальный пост? Кроме того, зачем вам это нужно, не очень распространенная практика.

4. @CamelSlack Несмотря на ByVal, текстовое поле является объектом: оно будет передано по ссылке.

Ответ №3:

Насколько я знаю, нет простого способа клонировать текстовое поле, но если вы хотите это сделать, вы можете просто скопировать соответствующие свойства:

 Dim aa As New TextBox
aa.Text = TextBox1.Text
'Copy over other relevant properties here
aa.Text = "hi how are you?"
 

Однако LarsTech поднимает хороший вопрос. Вам действительно нужно клонировать все текстовое поле? Разве не было бы достаточно просто скопировать текст?

Также обратите внимание, что опубликованный вами код делает не то, что вы думаете. Делая что-то вроде:

 Dim aa As New TextBox
aa = TextBox1
 

Сначала вы присваиваете aa переменную вновь созданному текстовому полю, затем повторно присваиваете эту переменную существующему текстовому полю1. Вы только что потеряли ссылку на только что созданное текстовое поле.