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

最後に、オブジェクトのコードを変更できない場合は、拡張メソッドを使用して同じことを行うことができます (必ずしもそうする必要はありません) 。1 つの一般的な解決策は次のとおりです。

' 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)

Withこれは、 VB.Netの構成に少し注意する価値がある理由の良い例です。With私の見解では、使用する価値があるようにするには、実際には1つまたは2つ以上のプロパティを設定するか、ステートメント内のオブジェクトに対して1つまたは2つ以上のメソッドを呼び出す必要があります。

たくさんあり、他のものを散在させていない場合.SomeProperty =.DoSomethingそれは読みやすさの素晴らしい助けになります。

逆に、他のものの中に散らばっているいくつかのドットは、実際にはまったく使用Withしないよりもはるかに読みにくいです。

この場合、.文字自体は視覚的に簡単に失われる可能性がありますが、もちろん構文的には一貫しています。

彼らはそれを実装しないことを選んだと思います。VBは、実際には1文字の言語要素を奨励したい種類の言語ではなく、VB.Netのヘビーユーザーとして、私は広く同意します。

結論:With多くの要素が含まれている句を使用している場合、オブジェクト自体を参照する必要があることはそれほど大きな問題ではありません。With1つまたは2つだけで使用している場合は、そもそも句を使用しない方がよいでしょう。

于 2010-03-04T20:42:26.913 に答える