2011-03-31 57 views
2

在C#中,可以这样做:VB.NET等价于C#中的无名变量?

new MyClass().MyMethod(); 

被执行的方法和参考文献是(通常)被丢弃,因为该对象没有参考被保持。

我的问题是:这可能与VB.NET(.NET v4)?


编辑:我想这是一个更好的例子:

new Thread((x) => doSomething()).Start(); 

在VB.NET这甚至可能吗?

回答

4

VB.NET对语句的语法有更严格的规则。花括号语言允许任何表达式也可以作为语句,只需用分号终止即可。 VB.NET不是这种情况。如果您调用的方法是Function,则只能使用此语法。它允许您使用赋值语句:

Dim result = New Test().Func() 

如果它是一个子,那么你就必须使用赋值语句来存储对象引用。这否则没有运行效果,参考被优化了。

+2

因此短期答案是“不”,这是不完全可能的(仅部分),因为VB的结构。谢谢。 – qJake 2011-03-31 14:39:42

+1

嗯,我更喜欢我的回答。但是,我是部分的。 – 2011-03-31 14:52:47

1

你可以做的lambda函数在VB.NET这样的:

Dim test = Function (x) 
    x.doStuff() 
End Function 

这将是语义equivilent到:

var test = (x) => x.doStuff(); 

我觉得一个限制是,它虽然必须返回一个结果在VB.NET下。

2

除了汉斯的答案,你可以使用一个With statement:

Sub Main 
    With New Person("Ahmad") 
     .PrintName() 
     .Name = "Mageed" 
     .PrintName() 
    End With 
End Sub 

Public Class Person 
    Public Property Name As String 
    Public Sub New(ByVal name As String) 
     Me.Name = name 
    End Sub 

    Public Sub PrintName() 
     Console.WriteLine("Name: {0} - Len: {1}", Name, Name.Length) 
    End Sub 
End Class 

它并不像C#作为简洁,但参照对象End With之后被丢弃。

+0

哦,所以你实际上*可以*创建一个临时引用。这也是很好的知道,谢谢! – qJake 2011-03-31 15:05:29

2

如果你想明确地调用子,而不是一个功能,您可以:

Call (New obj).Func() 

这将匿名创建一个新的OBJ,并调用它的函数功能()方法