检查委托中的方法是否等于我的 class 函数之一 (VB.NET)

Check if the method in a delegate is equal to one of my class functions (VB.NET)

我最近在 VB.NET 中发现了委托,因此我正在尝试进行一些测试以熟悉它们的工作方式。首先,我能够创建一个并将其指向一个简单地打印到屏幕上的函数,如下所示:

Public Delegate Function ByteDelegate() As Byte

Sub Main()
    Dim testDelegate As ByteDelegate = AddressOf PrintHello
    otherDelegate()
End Sub

Public Function PrintHello()
        Console.WriteLine("Hello!")
        Return &H0
End Function

接下来我想看看我是否可以检查这些委托中的一个是否确实指向我拥有的 PrintHello() 函数。我已尝试执行以下操作:

If test.operate.Method = otherDelegate.Method

If test.operate.Method.Name.CompareTo(otherDelegate.Method.Name)

但它们似乎都没有提供有效结果,我在网上搜索过,到目前为止还没有找到任何帮助,我正在努力了解我应该如何处理这个问题,所以任何帮助都是赞赏。

编辑: 在获得一些反馈后,我更新了我的代码以使用 Actions 或 Funcs,这两者我得到了相同的行为。由于我的函数需要 return 类型,因此我一直坚持使用 Func(Of Byte),因为在比较时操作似乎仍然 return false,而且据我所知,我应该只将它们用于 Subs。

我有一个名为 INSTRUCTION 的结构,它包含一个操作和一个字符串,如下所示:

Private Structure INSTRUCTION
    Public operate As Func(Of Byte)
    Public text As String
    
    Public Sub New(_operate As Func(Of Byte), _text As String)
        operate = _operate
        text = _text
    End Sub
End Structure

然后我创建了一种指令来解决我的 PrintHello 函数,并使用相同的函数进行另一个操作来比较:

Dim test As New INSTRUCTION(AddressOf PrintHello, "Other text.")
Dim otherFunction As Func(Of Byte) = AddressOf PrintHello

当我尝试将这些操作与

进行比较时
otherFunction.Equals(test.operate)

只是 return 是假的。

我根本不明白会发生什么,我认为从来没有什么事情让我这么难过。

我刚刚做了一些测试,委托的 Equals 方法似乎会告诉您它是否引用与另一个委托相同的方法,例如

Module Module1

    Sub Main()
        Dim d1 As New Action(AddressOf Method1)
        Dim d2 As New Action(AddressOf Method2)

        Dim dX As New Action(AddressOf Method1)

        If dX.Equals(d1) Then
            Console.WriteLine("dX.Equals(d1)")
        Else
            Console.WriteLine("Not dX.Equals(d1)")
        End If

        If dX.Equals(d2) Then
            Console.WriteLine("dX.Equals(d2)")
        Else
            Console.WriteLine("Not dX.Equals(d2)")
        End If

        Console.ReadLine()
    End Sub

    Private Sub Method1()

    End Sub

    Private Sub Method2()

    End Sub

End Module

请注意,委托必须是同一类型才能起作用。具有相同签名的两个不同类型的两个委托不能相等,即使它们引用相同的方法。

好吧,我想我终于弄明白了,在更改了我声明自己的委托类型的位置以仅使用 Func(Of Byte) 来比较其中的两个之后,我还需要明确说明 'As Byte' 在函数中像这样:

Public Function PrintHello() As Byte
    Console.WriteLine("Hello!")
    Return &HFF
End Function

而之前我是这样的:

Public Function PrintHello()
    Console.WriteLine("Hello!")
    Return &HFF
End Function

所以最后证明它真的很简单,感谢你告诉我在哪里使用 Action 和 Func,尽管它对未来的参考很有帮助。