gpt4 book ai didi

vb.net - VB.NET 中的 Action 委托(delegate)接受函数 lambda 表达式

转载 作者:行者123 更新时间:2023-12-04 17:51:49 24 4
gpt4 key购买 nike

我有一个将 Action 委托(delegate)作为参数的构造函数:

Public Class DelegateCommand
Public Sub New(execute As Action(Of T))
Me.New(execute, Nothing)
End Sub
End Command

' This works as expected
Dim executeIsCalled = False
Dim command = New DelegateCommand(Sub() executeIsCalled = True)
command.Execute(Nothing)
Assert.IsTrue(executeIsCalled) ' Pass

Action 没有返回值,MSDN 声明我必须为此目的使用 Sub ( MSDN Action Delegate)。
然而,这不是真的,因为完全可以使用函数委托(delegate):
Dim executeIsCalled = False    
Dim command = New DelegateCommand(Function() executeIsCalled = True)
command.Execute(Nothing)
Assert.IsTrue(executeIsCalled) ' Fail

这编译得很好,但是 executeIsCalled = True被解释为 return 语句,导致 executeIsCalled 的意外结果仍然是错误的。
有趣的是,您可以执行以下操作:
Dim executeIsCalled = False
Dim command = New DelegateCommand(Function()
executeIsCalled = True
Return False
End Function)
command.Execute(Nothing)
Assert.IsTrue(executeIsCalled) ' Pass

如何防止错误地使用 Function lambda 表达式?

最佳答案

这可能无法完美地解决您的需求,因为编译器不会帮助您 - 但至少您会在运行时发现错误,并且不会想知道为什么没有正确设置任何变量。

您可以使用 Delegate而不是 Action<>作为构造函数参数。不幸的是,VB.NET 仍然允许任何其他开发人员传入 Sub()Function() lambda 斯。但是,您可以查看 ReturnType如果不是 Void,则在运行时抛出异常.

Public Class DelegateCommand
Public Sub New(execute As [Delegate])

If (Not execute.Method.ReturnType.Equals(GetType(Void))) Then
Throw New InvalidOperationException("Cannot use lambdas providing a return value. Use Sub() instead of Function() when using this method in VB.NET!")
End If

execute.DynamicInvoke()
End Sub
End Class
Void来自 C# 世界,VB.NET 开发人员大多不知道。在那里,它用于编写没有返回值的方法(VB:Subs),就像任何其他返回值的方法(VB:Functions)一样。
private void MySub() 
{
// ...
}

private bool MyFunction()
{
return true;
}

关于vb.net - VB.NET 中的 Action 委托(delegate)接受函数 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34041163/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com