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

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

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

Ответы

Ответ 1

Нет ссылки на объект, на который есть ссылка в операторе With, кроме как для повторения имени самого объекта.

EDIT

Если вы действительно хотите, вы можете изменить свой объект так, чтобы он возвращал ссылку на себя

Public Function Self() as TypeOfAnObject
    Return Me
End Get

Тогда вы можете использовать следующий код

With Test.AnObject
    Test2.Subroutine(.Self())
End With

Наконец, если вы не можете изменить код для объекта, вы можете (но не обязательно) выполнить то же самое с помощью метода расширения. Одно общее решение:

' 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

Ответ 2

Я подозреваю, что тебе придется повториться. Если выражение (для получения объекта) является дорогостоящим, то, возможно, сначала поместите его в переменную и либо используйте эту переменную в With, либо полностью опустите With:

tmp = Test.AnObject;
tmp.Something = 1337;
...
Test2.Subroutine(tmp);

Ответ 3

Как говорили другие, вам придется писать

Test2.Subroutine(Test.AnObject)

Это хороший пример того, почему стоит быть осторожным с конструкцией With в VB.Net. Мое мнение состоит в том, что для того, чтобы сделать его полезным вообще, вам действительно нужно устанавливать более одного или двух свойств и/или вызывать более одного или двух методов для объекта в инструкции With.

Когда есть партии, и вы не вставляете .SomeProperty =, или .DoSomething, с другими вещами, это потрясающая помощь для удобочитаемости.

И наоборот, несколько точек, посыпанных среди нагрузки другого материала, на самом деле намного труднее читать, чем вообще не использовать With.

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

Я думаю, они просто решили не реализовывать его. VB на самом деле не тот язык, на котором они хотят поощрять отдельные элементы языка символов, и как сильный пользователь VB.Net, я в целом согласен с этим.

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

Ответ 4

Я не уверен, что это "ответ" сам по себе, но он иллюстрирует еще одну причину, по которой требуется короткая ссылка на родителя в With.

Вот пример кода, использующий "bare 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.

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