2011-03-31 50 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,並調用它的函數功能()方法