在VB.net中,委托Action与Func的比较

一、知识点

|----------------------------------------------------------------------------------------------------------------------------|
| 在VB.NET中,Action 是一种预定义的委托类型,它允许你传递方法作为参数。Action 委托用于引用一个或多个没有返回值(即返回 Sub 而不是 Function)的方法。Action 可以不带参数,也可以带最多16个参数,但都不返回值 |
| 在VB.NET中,Func 是 .NET 提供的一组泛型委托,用于引用有返回值的方法。Func 至少有一个类型参数,最后一个类型参数表示返回值的类型,前面的类型参数表示方法的输入参数 |

二、Action委托,的几种常见用法示例:

1.不带参数的 Action

这是最简单的形式,表示一个不接受任何参数且不返回值的操作。

makefile 复制代码
Dim myAction As Action = AddressOf MyMethod' 或者使用Lambda表达式myAction = Sub() Console.WriteLine("Hello, World!")' 调用委托myAction()

这里MyMethod 应该是一个事先定义好的 Sub ,它不接受任何参数。

2.带参数的 Action

你可以创建带有参数的 Action 。例如,带有一个参数的 Action :

makefile 复制代码
Dim myActionWithParam As Action(Of String) = AddressOf MyMethodWithParam' 或者使用Lambda表达式myActionWithParam = Sub(name As String) Console.WriteLine($"Hello, {name}")' 调用委托,并传入参数myActionWithParam("World")

在这个例子中,
MyMethodWithParam 是一个接受一个 String 参数的 Sub 方法。

3.多个参数的 Action

Action 也支持多个参数,比如两个参数的例子:

sql 复制代码
Dim myActionWithTwoParams As Action(Of Integer, Integer) = Sub(x, y) Console.WriteLine(x + y)' 调用委托,并传入参数myActionWithTwoParams(5, 3)

这会输出
8 到控制台。

4.使用场景

  • 回调函数:当你需要一个方法作为另一个方法执行完毕后的回调时。
  • 异步编程:在处理异步操作的结果时非常有用。
  • 简化代码:避免了为简单的操作定义完整的类或方法的必要性。

总之, Action 委托提供了一种简洁的方式来引用那些不需要返回结果的方法,使你的代码更加清晰和灵活。通过结合 Lambda 表达式,可以使代码更简洁易读。

如果你需要委托一个有返回值的方法,在 VB.NET 中,你应该使用 Func 委托,而不是 Action 。

三、Func 委托,常见用法示例

1. 无参数,有返回值( Func(Of T ,Result) )
sql 复制代码
Dim getValue As Func(Of String) = Function() "Hello from Func!"' 或者引用一个已有方法Dim getValue2 As Func(Of String) = AddressOf GetGreetingConsole.WriteLine(getValue())  ' 输出: Hello from Func!Console.WriteLine(getValue2()) ' 调用 GetGreeting 方法' 示例方法Function GetGreeting() As String    Return "Hi there!"End Function
  1. 一个参数,有返回值(
    Func(Of T, TResult) )
sql 复制代码
Dim square As Func(Of Integer, Integer) = Function(x) x * xConsole.WriteLine(square(5))  ' 输出: 25
  1. 多个参数,有返回值(例如两个参数)
sql 复制代码
Dim add As Func(Of Integer, Integer, Integer) = Function(a, b) a + bConsole.WriteLine(add(3, 7))  ' 输出: 10
  1. 更复杂的例子:字符串处理
sql 复制代码
Dim processName As Func(Of String, String) = Function(name)                                               If String.IsNullOrEmpty(name) Then                                                  Return "Anonymous"                                              Else                                                  Return name.ToUpper()                                              End If                                          End FunctionConsole.WriteLine(processName("alice"))  ' 输出: ALICEConsole.WriteLine(processName(""))       ' 输出: Anonymous

四、Action vs Func 总结

但在实际开发中,超过 3-4 个参数的情况较少见,通常建议重构为更清晰的设计。

策略模式 / 条件判断

  • 依赖注入中的工厂方法

结论

如果你的方法有返回值,请使用 Func(Of ...) ;

如果没有返回值,使用 Action(Of ...) 。

两者结合 Lambda 表达式,可以写出非常简洁、函数式风格的 VB.NET 代码。

相关推荐
还在忙碌的吴小二10 分钟前
Harness 最佳实践:Java Spring Boot 项目落地 OpenSpec + Claude Code
java·开发语言·spring boot·后端·spring
liliangcsdn10 分钟前
mstsc不在“C:\Windows\System32“下在C:\windows\WinSxS\anmd64xxx“问题分析
开发语言·windows
小陈工21 分钟前
2026年4月7日技术资讯洞察:下一代数据库融合、AI基础设施竞赛与异步编程实战
开发语言·前端·数据库·人工智能·python
KAU的云实验台24 分钟前
【算法精解】AIR期刊算法IAGWO:引入速度概念与逆多元二次权重,可应对高维/工程问题(附Matlab源码)
开发语言·算法·matlab
会编程的土豆31 分钟前
【数据结构与算法】再次全面了解LCS底层
开发语言·数据结构·c++·算法
jerryinwuhan41 分钟前
RDD第二次练习
开发语言·c#
wechat_Neal43 分钟前
Golang的车载应用场景
开发语言·后端·golang
weixin_513449961 小时前
walk_these_ways项目学习记录第八篇(通过行为多样性 (MoB) 实现地形泛化)--策略网络
开发语言·人工智能·python·学习
飞Link1 小时前
逆向兼容的桥梁:3to2 自动化降级工具实现全解析
运维·开发语言·python·自动化
曾阿伦2 小时前
Python3 文件 (夹) 操作备忘录
开发语言·python