有没有办法让我在没有先声明变量的情况下对变量的新实例进行函数调用?
因此,例如在Java中,您可以这样做:
new foo().bar(parameters);
我在Visual Basic中尝试过类似的东西,但这是一个语法错误。目前我正在创建一个变量,然后运行该函数。
dim instance as new foo()
instance.bar(parameters)
我可以采用与上述Java代码类似的方法吗?
答案 0 :(得分:4)
不完全是。您可以通过在括号中包围实例来更大的表达式,例如:
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()
答案 1 :(得分: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
答案 2 :(得分:0)
就像SSS提供了最适合类的方法一样,另一种方法是使用模块,如果它不是强制你只使用类。
模块提供了对功能的轻松访问,甚至无需为它们创建对象。