Как получить доступ к самому объекту в С... Конец С
Некоторый код, чтобы проиллюстрировать мой вопрос:
With Test.AnObject
.Something = 1337
.AnotherThing = "Hello"
''// why can't I do this to pass the object itself:
Test2.Subroutine(.)
''// ... and is there an equivalent, other than repeating the object in With?
End With
4 ответа
Нет никакого способа обратиться к объекту, на который есть ссылка в операторе With, кроме повторения имени самого объекта.
РЕДАКТИРОВАТЬ
Если вы действительно хотите, вы можете изменить свой AnObject, чтобы он возвращал ссылку на себя
Public Function Self() as TypeOfAnObject
Return Me
End Get
Тогда вы можете использовать следующий код
With Test.AnObject
Test2.Subroutine(.Self())
End With
Наконец, если вы не можете изменить код для AnObject, вы можете (но не обязательно) выполнить то же самое с помощью метода расширения. Одно общее решение:
' Define in a Module
<Extension()>
Public Function Self(Of T)(target As T) As T
Return target
End Function
называется так:
Test2.Subroutine(.Self())
или же
With 1
a = .Self() + 2 ' a now equals 3
End With
Я подозреваю, что вам придется повториться. Если выражение (чтобы получить объект) дорого, то, возможно, сначала поместите его в переменную, и либо используйте эту переменную в With
или бросьте With
полностью:
tmp = Test.AnObject;
tmp.Something = 1337;
...
Test2.Subroutine(tmp);
Как уже говорили другие, вам придется написать
Test2.Subroutine(Test.AnObject)
Это хороший пример того, почему стоит быть немного осторожнее с With
построить в VB.Net. Я считаю, что для того, чтобы это вообще стоило использовать, вам действительно нужно установить более одного или двух свойств и / или вызвать более одного или двух методов для объекта в With
заявление.
Когда есть много, и вы не перемежаете .SomeProperty =
, или же .DoSomething
С другими вещами, это потрясающая помощь для удобочитаемости.
И наоборот, несколько точек, разбросанных среди множества других вещей, на самом деле намного сложнее читать, чем не использовать With
совсем.
В этом случае, .
персонажи сами по себе могут легко потеряться визуально, хотя, конечно, это будет синтаксически согласованным.
Я думаю, они просто решили не реализовывать это. На самом деле VB - это не тот язык, на котором они хотят поощрять односимвольные элементы языка, и, как опытный пользователь VB.Net, я в целом согласен с этим.
Итог: если вы используете With
предложение со многими содержащимися элементами, необходимость ссылаться на сам объект не такая уж большая проблема. Если вы используете его только с одним или двумя, может быть, лучше не использовать With
пункт в первую очередь.
Я не уверен, что это "ответ" сам по себе, но он иллюстрирует еще одну причину, чтобы хотеть краткую ссылку на родителя в With
,
Вот пример кода с использованием "голого С" (так я его называю):
With New frmMySubForm
.lblLinkLabel.Links.Add(New LinkLabel.Link With {.Name = "link", .LinkData = "someUrl", .Start = .lblLinkLabel.Text.IndexOf("link"), .Length = "link".Length})
...
End With
Но вы на самом деле не можете кодировать это, потому что в терминах .Start = .lblLinkLabel.Text.IndexOf("link")
компилятор ожидает чего-либо, начиная с .
быть членом LinkLabel.Link, которая .lblLinkLabel
нет.
Я думаю, что было бы хорошо, если бы можно было написать что-то вроде:
With New frmMySubForm
.lblLinkLabel.Links.Add(New LinkLabel.Link With {.Name = "link", .LinkData = "someUrl", .Start = Me.lblLinkLabel.Text.IndexOf("link"), .Length = "link".Length})
...
End With
где Me
в этой области принимается за New frmMySubForm
,
Да, я понимаю, что я привередлив, и я мог легко назначить переменную и т. Д. Но я часто использую форму примера просто из предпочтения.