最初に宣言せずに、変数の新しいインスタンスで関数呼び出しを行う方法はありますか?
したがって、たとえばJavaでは、次のことができます。
new foo().bar(parameters);
Visual Basicで同様のことを試しましたが、構文エラーです。今のところ、変数を作成してから関数を実行しています。
dim instance as new foo()
instance.bar(parameters)
上記のJavaコードと同様にできることはありますか?
最初に宣言せずに、変数の新しいインスタンスで関数呼び出しを行う方法はありますか?
したがって、たとえばJavaでは、次のことができます。
new foo().bar(parameters);
Visual Basicで同様のことを試しましたが、構文エラーです。今のところ、変数を作成してから関数を実行しています。
dim instance as new foo()
instance.bar(parameters)
上記のJavaコードと同様にできることはありますか?
ではない正確に。たとえば、括弧でインスタンス化を囲むことにより、より大きな式でこれを行うことができます。
MessageBox.Show((New String("y"c, 1)).ToUpper())
または、実際には、もっと紛らわしいと思いますが、インスタンス化の前後に括弧は必要ありません。
MessageBox.Show(New String("y"c, 1).ToUpper())
ただし、そのようなメソッドを呼び出すだけの場合、私が知っている唯一の方法は、CType
演算子でラップすることです。たとえば、次のようなクラスがある場合:
Private Class Test
Public Sub Show()
MessageBox.Show("Hello")
End Sub
End Class
Show
次のようにメソッドを呼び出すことができます。
CType(New Test(), Test).Show()
しかし、それは少し不器用です。
実際、昨日投稿して以来、SSSはさらに良い答えを提供してくれました。演算子でラップする代わりに、キーワードCType
を使用できます。Call
例えば:
Call New Test().Show()
はい、できます。私は次のパターンをよく使用します。別の方法は、Sub New()にパラメーターを追加することです。初期化が失敗する可能性があり、例外をスローする代わりにnull参照(Nothing)を返したい場合は、このパターンを使用します。
Public Class Foo
Property Prop1 As String
Property Prop2 As String
Public Shared Function Bar(p1 As String, p2 As String) As Foo
Dim f As Foo
If p1 = "" Or p2 = "" Then
'validation check - if either parameter is an empty string, initialisation fails and we return a null reference
f = Nothing
Else
'parameters are valid
f = New Foo
f.Prop1 = p1
f.Prop2 = p2
End If
Return f
End Function
''' <summary>
''' Optional - marking the Sub New as "Private" forces the caller to use the Bar() function to instantiate
''' </summary>
''' <remarks></remarks>
Private Sub New()
End Sub
End Class
SSSがクラスに最適な方法を提供しているように、クラスのみを使用することが強制されていない場合は、モジュールを使用することもできます。
モジュールを使用すると、オブジェクトを作成しなくても、機能に簡単にアクセスできます。