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() 添加参数。我在初始化可能失败时使用此模式,并且您希望返回空引用(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 提供了最适合 Classes 的方式一样,如果不强迫您只使用 Classes,另一种方法可能是使用 Modules。

模块提供了对功能的轻松访问,甚至无需为它们创建对象。

于 2013-05-06T14:32:37.877 回答