gpt4 book ai didi

.net - 使用自定义委托(delegate)与操作调用方法

转载 作者:行者123 更新时间:2023-12-02 02:04:27 35 4
gpt4 key购买 nike

我看到微软建议使用 a custom Delegate in the InvokeRequired pattern

但我不明白为什么人们在做一些像设置控件属性这样简单的事情时不直接省去定义委托(delegate)的麻烦。我指的是下面的 选项 1,它只使用委托(delegate) Action(Of String) 而不是自定义委托(delegate)。

' Option 1

Private Sub setLabelWorkingText(ByVal [text] As String)
If Me.lblWorking.InvokeRequired Then
Me.Invoke(New Action(Of String)(AddressOf setLabelWorkingText), [text])
Else
Me.lblWorking.Text = [text]
End If
End Sub

' Option 2

Private Delegate Sub setLabelWorkingTextDelegate(ByVal [text] As String)

Private Sub setLabelWorkingTextWithDel(ByVal [text] As String)
If Me.lblWorking.InvokeRequired Then
Me.Invoke(New setLabelWorkingTextDelegate(AddressOf setLabelWorkingTextWithDel), [text])
Else
Me.lblWorking.Text = [text]
End If
End Sub

我理解的一个区别是不能使用 Action 和 Func 传递 ByRef 参数,但自定义委托(delegate)可以指定 ByRef 参数。两者之间还有其他区别吗?

最佳答案

Action 本质上是一个通过泛型定义的自定义委托(delegate)。我猜你链接到的模式中没有指定它的原因是模式和 Action 委托(delegate)是同时开发/发布的,开发模式和文档的人可能不熟悉 Action 泛型在发布时。您会注意到,随着 Action 获得认可,它在框架的更高版本的示例和模式中使用得更频繁。

此外,关于您对 Action 和 Func 的 ByRef 参数的评论,这是正确的,但是实现一个接受参数 ByRef 的自定义通用类 Action 类也是微不足道的,如:

Public Delegate Sub ActionByRef(Of T)(ByRef ref As T)

Sub Main()
Dim sMyString As String = "Hello World"
Dim actTrim As New ActionByRef(Of String)(AddressOf TrimFirst)
actTrim.Invoke(sMyString)
Console.WriteLine(sMyString) 'prints "ello World"
Console.ReadLine()
End Sub

Sub TrimFirst(ByRef s As String)
s = s.Substring(1)
End Sub

关于.net - 使用自定义委托(delegate)与操作调用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15775712/

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