Как получить доступ к самому объекту в С... Конец С

Некоторый код, чтобы проиллюстрировать мой вопрос:

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,

Да, я понимаю, что я привередлив, и я мог легко назначить переменную и т. Д. Но я часто использую форму примера просто из предпочтения.

Другие вопросы по тегам