2

最初に宣言せずに、変数の新しいインスタンスで関数呼び出しを行う方法はありますか?

したがって、たとえばJavaでは、次のことができます。

new foo().bar(parameters);

Visual Basicで同様のことを試しましたが、構文エラーです。今のところ、変数を作成してから関数を実行しています。

dim instance as new foo()
instance.bar(parameters)

上記のJavaコードと同様にできることはありますか?

4

3 に答える 3

5

ではない正確に。たとえば、括弧でインスタンス化を囲むことにより、より大きな式でこれを行うことができます。

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()
于 2012-08-23T18:15:43.623 に答える
1

はい、できます。私は次のパターンをよく使用します。別の方法は、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
于 2012-08-24T02:11:00.100 に答える
0

SSSがクラスに最適な方法を提供しているように、クラスのみを使用することが強制されていない場合は、モジュールを使用することもできます。

モジュールを使用すると、オブジェクトを作成しなくても、機能に簡単にアクセスできます。

于 2013-05-06T14:32:37.877 に答える