我在上下搜索有关如何使用此功能的文档。尽管我可以编写的循环很简单,并且不需要任何时间,但我真的很想学习如何使用它。

基本上,我有一个类Widget,它的Save()子类不返回任何内容。所以:

Dim w as New Widget()
w.Save()

基本上保存小部件。现在让我们说我有一个通用集合List(Of Widget)名称widgetList(Of Widget),我想对该列表中的每个项目运行一个Save()。它说我可以做一个
widgetList.ForEach([enter Action(Of T) here])

....但是在F中是如何工作的呢???内标上的任何地方都没有文档。帮助将不胜感激。

最佳答案

如果您使用的是VB9(VS2008),我认为您将无法轻松使用匿名函数-据我所知,VB9中的匿名函数必须是真实函数(即,它们必须返回一个值),而Action<T>不返回任何内容。 C#2的匿名方法和C#3的lambda表达式更为通用,这就是为什么您会看到使用C#中的List<T>.ForEach和使用VB很少的示例的原因:(

您可能会编写一个MakeAction包装器,该包装器接受一个Function<T,TResult>并返回一个Action<T>,但是我怀疑对VB9匿名函数的其他限制将使其不切实际。

好消息是VB10 has much more anonymous function support。 (C#4和VB10正在彼此获得功能-我相信MS从现在开始要努力实现语言均等,比以前更大。)

在此之前,要使用List<T>.ForEach,您需要编写一个适当的Sub并使用AddressOf从中创建一个委托(delegate)。这是一个小例子:

Imports System
Imports System.Collections.Generic

Public Class Test

    Shared Sub Main()
        Dim names as New List(Of String)
        names.Add("Jon")
        names.Add("Holly")
        names.ForEach(AddressOf PrintMe)

    End Sub

    Shared Sub PrintMe(ByVal text as String)
        Console.WriteLine(text)
    End Sub

End Class

10-07 20:00
查看更多