Проверьте, равен ли метод в делегате одной из моих функций класса (VB. NET) - PullRequest
0 голосов
/ 04 августа 2020

Недавно я узнал о делегатах в 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)

Но ни один из них, похоже, не дает достоверных результатов, я искал в Интернете и пока не нашел ничего полезного, и я изо всех сил пытаюсь понять как я должен поступить так, чтобы любая помощь была бы оценена. Поскольку моим функциям нужны возвращаемые типы, я придерживался использования Fun c (Of Byte), поскольку действия по-прежнему возвращают 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

Затем я создаю тип INSTRUCTION, который обращается к моей функции PrintHello, а также выполняю другое действие с той же функцией для сравните:

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

Когда я пытаюсь сравнить эти действия с

otherFunction.Equals(test.operate)

, он просто возвращает false.

Я не понимаю, что может происходить в все, я не думаю, что что-то когда-либо так ставило меня в тупик.

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

Хорошо, я думаю, что наконец-то понял это, после изменения места, где я объявил свои собственные типы делегатов, чтобы просто использовать Fun c (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 и Fun c, хотя это будет здорово для справок в будущем.

0 голосов
/ 05 августа 2020

Я только что провел небольшое тестирование, и оказалось, что метод 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

Обратите внимание, что делегаты должен быть одного типа, чтобы это работало. Два делегата двух разных типов с одной и той же подписью не могут быть равными, даже если они ссылаются на один и тот же метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...