【问题标题】:Delegates in VB - how to from C#?VB 中的代表 - 如何从 C# 开始?
【发布时间】:2010-02-23 00:58:24
【问题描述】:

我一直坚持将此 C# 代码转换为 VB:

AsyncHelpers.Async.Do(delegate { WriteStuff("additional stuff..."); });

我以为会是这样的

AsyncHelpers.Async.Do(Function() WriteStuff("additional stuff...")

但我收到错误“表达式不产生值”。

谁能给我适当的VB.Net翻译?

谢谢。

=========== 更新

.
. 
. 

             Async.Do(New DlgR(AddressOf WriteStuff))


        End Sub

        Friend Shared Sub WriteStuff(ByVal thisStr As String)
            'do stuff with thisStr

        End Sub

根据下面 Brian 的建议,这仍然行不通。

如何获取传递给 WriteStuff 的参数?

最后,我还遇到了将委托函数 DlgR() 作为对象的签名兼容性错误。

【问题讨论】:

    标签: delegates c#-to-vb.net


    【解决方案1】:

    VB.Net 在支持 lambda 表达式方面做得不是很好(请参阅Use Lambda Expression within ASP.NET MVC View using VB.NET)。

    你可以试试这样的……

    Sub Main()
        Async.Do(New DlgR(AddressOf WriteStuff))
    End Sub
    Public Function WriteStuff(ByVal msg As String) As Object
        Console.WriteLine(msg)
        Return Nothing
    End Function
    

    根据您的代码,我假设您正在关注 CodeProject 文章 Towards Cleaner Code, A C# Asynchronous Helper,因此我在示例中使用了代表的名称和签名。如果您使用的是其他库,则委托的名称和签名可能不同。

    更新:VB.Net does not support closures(查看http://msmvps.com/blogs/bill/archive/2006/04/05/89370.aspx 了解更多信息)因此,据我所知,您不能将参数传递给该方法。我能想到的最简单的方法是创建自己的闭包类并像这样调用它......

    Module Module1
        Sub Main()
            Dim c1 = New MyClosure("Hello World")
            Dim c2 = New MyClosure("Test 123")
            CodeToast.Async.Do(New Dlg(AddressOf c1.WriteStuff))
            CodeToast.Async.Do(New Dlg(AddressOf c2.WriteStuff))
            Console.ReadKey()
        End Sub
    End Module
    Public Class MyClosure
        Public Sub New(ByVal msg As String)
            Message = msg
        End Sub
        Public Message As String
        Public Sub WriteStuff()
            Console.WriteLine(Message)
        End Sub
    End Class
    

    【讨论】:

    • 关于信息,VS2010 中的 VB 10 将支持子程序 lambda,包括多行 lambda。这应该很快就会发布,因此这也可能是一个选项,具体取决于 Eli 的时间框架、部署要求、VS2010 对其团队的可用性等。
    • 好点。我正要提到这一点,但在试图弄清楚 AsyncHelpers 是什么之后忘记了,所以我可以弄清楚签名是什么:)。感谢您添加它。
    • Brian,是的,这是我尝试使用的类,所以实现异步方法调用。根据我上面的编辑,使用您的示例,您将如何将参数传递给 WriteStuff?由于 C# 更像是我的基础,而这对我来说是新的 VB 基础,所以您能否为我提供一个完整的源代码?谢谢。
    • ... 另外,我正在尝试将它与 MS Enterprise Library Logger.Write 一起使用。由于这个类不是静态的,这甚至可以工作吗?
    • Brian,一开始我也有同样的担心,关于将参数传递给方法。但是,请在下面查看我的解决方案 - 以及它的工作原理。
    【解决方案2】:

    终于有时间解决这个问题了,在“多行”中它在 C# 中......

    我在班级级别声明了我的委托:

    Public Delegate Sub loggerDelegate(ByVal a As LogEntry)
    

    然后,在我的方法中,我进行异步日志调用

        ' make the async logging call
        Dim myDel As loggerDelegate = New loggerDelegate(AddressOf Logger.Write)
        myDel(logEntry)
    

    我想我应该在不使用 MSMQ 的情况下将其称为使用 MS 企业库的异步日志记录,但你明白了。

    希望这对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 1970-01-01
      • 2016-06-22
      • 2017-09-01
      相关资源
      最近更新 更多