簡體   English   中英

C#到VB - 如何將此匿名方法/ lambda表達式轉換為?

[英]C# to VB - How do I convert this anonymous method / lambda expression across?

你會如何將它轉換為VB(使用.NET 4.0 / VS2010)?

bw.DoWork += (o, args) =>
{
     Code Here
};

我想也許是這樣的:

AddHandler bw.DoWork,
    Function(o, args)

        Code Here

    End Function

但它表示Function不會在所有代碼路徑上返回值。

想法?

VB.NET缺乏這個

有趣的位:

(..)VB沒有匿名方法,只有Lambda表達式(沒有辦法聲明一個匿名的Action委托)。

你不能這樣做,但你可以讓它像:

  Sub New()    
    AddHandler bw.DoWork, AddressOf Stuff    
  End Sub

  Sub Stuff(ByVal o, ByVal args)    
    ' Code Here '   
  End Sub

您基本上是添加一個調用代碼的事件,除了通過傳遞給例程的參數之外,沒有事件返回值。 這使它成為一個Sub而不是一個函數。

我嘗試使用.NET 4.0的Sub方式,並沒有得到任何錯誤

AddHandler bw.DoWork,
    Sub(sender As Object, e As System.ComponentModel.DoWorkEventArgs)

        'Code(Here)

    End Sub

問題是我們需要知道“Code Here”的作用。 函數必須返回一個值(有一個Return語句)。 如果您不想返回值,那么您的Function需要是Sub。

在2010年之前你不會得到多行lambda。如果你必須在VB9中轉換多行,那么你必須做一些旋轉,但它可以完成。 您最終必須創建一個holder對象,在其上設置屬性,然后調用共享函數,而不是像C#中那樣優雅

嘗試在VBNET2008中使用lambda表達式時遇到了類似的東西。

由於關鍵字Function用於向編譯器指示使用lambda表達式,因此表達式必須返回一個值。 在這種情況下,使用關鍵字Sub會更合適,但在VBNET2008中還不可能。

VBNET2010應該通過在lambda表達式中允許Subs來解決這個問題。

這是一個解決方法的例子,在這個問題上對我來說非常有用: 這個C#的等效VB.NET代碼是什么...

簡而言之,您需要使用AddressOf Sub指向您希望執行工作的Sub,而不是將lambda表達式寫入方法的核心。

David Parvin也確實根據您的需要編寫了解決方法。

編輯:

您可以隨時選擇代理解決方案。 私人代表Sub MyMethodAsync()

Public Sub Button1_Click(...) Handles Button1.Click
    Dim myMethodAsync As MyMethodAsync = AddressOf MyDoWorkAsync

    _myBackgroundWorker.RunWorkerAsync(myMethodAsync)
    Dim loadingForm = New LoadingForm()
    loadingForm.ShowDialog()
End Sub

Private Sub _myBackgroundWorker_DoWork([parameters here...]) Handles _myBackgroundWorker.DoWork
    ' Do some stuff...
End Sub

我知道這不是匿名方法,因此你可能真的很難在VBNET中嘗試這種方式,甚至是2008.這些功能應該是VBNET2010的一部分,但我認為它們已經刪除了,但我是真的不太確定它是否堅定。

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM