#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. Вы только что потеряли ссылку на только что созданное текстовое поле.