Как получить доступ к самому объекту в С ... Конец С - PullRequest
13 голосов
/ 20 июля 2009

Код для иллюстрации моего вопроса:

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 ]

18 голосов
/ 20 июля 2009

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

EDIT

Если вы действительно хотите, вы можете изменить свой 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
6 голосов
/ 20 июля 2009

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

tmp = Test.AnObject;
tmp.Something = 1337;
...
Test2.Subroutine(tmp);
5 голосов
/ 04 марта 2010

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

Test2.Subroutine(Test.AnObject)

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

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

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

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

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

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

0 голосов
/ 25 мая 2017

Я не уверен, что это «ответ» сам по себе, но он иллюстрирует еще одну причину, по которой нужна краткая ссылка на родителя в 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.

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

...