检查委托中的方法是否等于我的 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,尽管它对未来的参考很有帮助。
我最近在 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,尽管它对未来的参考很有帮助。