15

一些代码来说明我的问题:

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

4 回答 4

20

除了重复对象本身的名称外,没有其他方法可以引用 With 语句中引用的对象。

编辑

如果你真的想要,你可以修改你的对象以返回对自身的引用

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
于 2009-07-20T11:23:52.473 回答
6

我怀疑你将不得不重复自己。如果表达式(获取对象)很昂贵,则可能先将其放入变量中,然后在 中使用该变量With,或完全删除With

tmp = Test.AnObject;
tmp.Something = 1337;
...
Test2.Subroutine(tmp);
于 2009-07-20T11:24:44.140 回答
5

正如其他人所说,你将不得不写

Test2.Subroutine(Test.AnObject)

这是一个很好的例子,说明为什么对WithVB.Net 中的构造要小心一点。我的观点是,要让它完全值得使用,您确实需要设置不止一两个属性,和/或在With语句中的对象上调用不止一两个方法。

如果有很多,并且您没有将.SomeProperty =, 或.DoSomething与其他东西穿插,这对可读性有很大帮助。

相反,散布在一堆其他东西中的几个点实际上比根本不使用要难读得多With

在这种情况下,.字符本身很容易在视觉上迷失方向,当然,它在语法上是一致的。

我猜他们只是选择不实施它。VB 并不是他们真正想要鼓励单字符语言元素的语言,作为 VB.Net 的重度用户,我大致同意这一点。

底线:如果您使用With包含许多包含元素的子句,则必须引用对象本身并不是什么大问题。如果您只使用一两个,最好不要一开始就使用With子句。

于 2010-03-04T20:42:26.913 回答
0

我不确定这本身是一个“答案”,但它确实说明了另一个需要在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

是的,我意识到我很挑剔,我可以很容易地分配一个变量等。但是示例表单是我出于偏好而经常使用的东西。

于 2017-05-25T18:59:36.660 回答