【问题标题】:What is the VB equivalent of this C# syntax, dealing with delegates?处理委托的这种 C# 语法的 VB 等价物是什么?
【发布时间】:2009-11-20 15:24:12
【问题描述】:

是否可以使用 VB 9.0 将以下 C# 代码转换为 VB.NET?

delegate Stream StreamOpenerDelegate(String name);

void Exec1()
{
    WorkMethod( x => File.OpenRead(x));
}

void Exec2()
{
    StreamOpenerDelegate opener = x => return File.OpenRead(x) ;
    WorkMethod(opener);
}

我可以这样做吗?:

Private Delegate Function StreamOpenerDelegate(ByVal name As String) As Stream

Private Sub WorkMethod(ByVal d As StreamOpenerDelegate)
    ''
End Sub

Private Sub Exec1()
    Me.WorkMethod(Function (ByVal x As String) 
        Return File.OpenRead(x)
    End Function)
End Sub

Private Sub Exec2()
    Dim opener As StreamOpenerDelegate = Function (ByVal x As String) 
        Return File.OpenRead(x)
    End Function
    Me.WorkMethod(opener)
End Sub

我正在尝试编写一些文档,但我不知道 VB 语法。我经常使用Reflector 来翻译它,但我不确定它在这种情况下是否有效。我也不清楚在哪里需要换行符。


回答
在 VB9 中,不可能有多行 lambda(或 Sub lambda,我没有问过)。在 VB9 中,所有 lambda 表达式都返回一个值,并且必须是单个表达式。这在 VB10 中发生了变化。 VB10 将允许上述语法,但 VB9 不允许。在VB9中,如果逻辑涉及多行代码,则一定不能是lambda;您必须将其放入命名函数并显式引用它。像这样:

Private Delegate Function StreamOpenerDelegate(ByVal name As String) As Stream

Private Sub WorkMethod(ByVal d As StreamOpenerDelegate)
    ''
End Sub

Function MyStreamOpener(ByVal entryName As String) As Stream
    '' possibly multiple lines here
    Return File.OpenRead(entryName)
End Function

Private Sub Exec1()
    Me.WorkMethod(AddressOf MyStreamOpener)
End Sub

网站:Mike McIntyre's blog

【问题讨论】:

  • 好吧,我只能在这里问 Reflector。而且它非常擅长翻译语法:-)

标签: c# vb.net delegates lambda


【解决方案1】:

这应该可行:

Private Sub Exec1()
    Me.WorkMethod(Function (x) File.OpenRead(x))
End Sub

Private Sub Exec2()
    Dim opener As StreamOpenerDelegate = Function (x) File.OpenRead(x)

    Me.WorkMethod(opener)
End Sub

您需要行继续符将单行语句拆分为多行,如下所示:

Private Sub Exec1()
    Me.WorkMethod(Function (x) _
                    File.OpenRead(x))
End Sub

Private Sub Exec2()
    Dim opener As StreamOpenerDelegate = Function (x) _
                                           File.OpenRead(x)

    Me.WorkMethod(opener)
End Sub

在任何情况下,VS2010 在某些字符之后都有隐式续行。所以我不会太担心。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-06
    • 2013-04-29
    相关资源
    最近更新 更多