المفوضين (Visual Basic)

المفوضين هي الكائنات التي تشير إلى أساليب. تم وصفها في بعض الأحيان كـ مؤشرات دالة نوع - آمن لأنها تتشابه مع مؤشرات دالة المستخدمة في لغات البرمجة الأخرى. ولكن بعكس مؤشرات دالة، مفوضين Visual Basic يكون استناداً إلى نوع فئة المرجع System.Delegate. مفوضين يمكن أن يشير لكلا الأسلوبين المشتركين — الأساليب التي يمكن استدعاؤه دون مثيل فئة محدد — و أساليب المثيل.

المفوضين والأحداث

تفيد التفويضات في المواقف التي تحتاج الوسيط ما بين إجراء المستدعية الإجراء الذي يتم استدعاءه. على سبيل المثال، قد تحتاج إلى كائن رفع أحداث لتكون قادراً على استدعاء مختلف معالجات حدث تحت ظروف مختلفة. لسوء الحظ، الكائن يقوم برفع الأحداث لا يمكنه معرفة الأحداث مسبقا في معالج الأحداث الذي يعالج حدث معين. Visual Basic يتيح لك معالجات الأحداث بشكل حيوي عنها وإرفاق بأحداث عن طريق إنشاء تفويض لك عند استخدام العبارة AddHandler. وقت التشغيل تفويض يعيد توجيه استدعاءات معالج حدث المناسب.

على الرغم من أنه يمكنك إنشاء الخاصة بك تفويض s، في معظم الأحوال Visual Basic إنشاء تفويض و تتولى عملية التفاصيل نيابة عنك. على سبيل المثال، Event كشف ضمنيا تعريف فئة تفويض باسم <EventName>EventHandler نتيجة لرسم فئة متداخلة من الفئة التي تحتوي على Event كشف مع نفس حدث توقيع. The AddressOf كشف ضمنيًا إنشاء مثيل من تفويض التي تشير إلى إجراء محدد. السطرين التاليين من التعليمات البرمجية متكافئ. في أول سطر ، تشاهد إنشاء صريح لمثيل Eventhandler، مع مرجع إلى أسلوب Button1_Click أرسلت كوسيطة. السطر الثاني طريقة أكثر مناسبة للقيام بنفس الشيء.

AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)
' The following line of code is shorthand for the previous line.
AddHandler Button1.Click, AddressOf Me.Button1_Click

يمكنك استخدام اختصار في طريقة إنشاء تفويضات في أي مكان يستطيع المحول البرمجي يمكن نوع التفويض بواسطة السياق.

تعريف أحداث التي تستخدم نوع تفويض موجود

في بعض الحالات، قد تحتاج إلى تعريف حدث لاستخدام نوع تفويض موجود كتفويض المصدر الخاص به. بناء الجملة التالية يوضح كيفية:

Delegate Sub DelegateType()
Event AnEvent As DelegateType

هذا مفيد عندما تريد توجيه أحداث متعددة إلى نفس المعالج.

متغيرات التفويض و المعلمات

يمكنك استخدام التفويضات لبعض مهام التي حدث ليست متعلقة، مثل الترابط الحر أو مع الإجراءات التي تحتاج إلى استدعاء إصدارات مختلفة من الدالات في وقت التشغيل.

على سبيل المثال، افترض أن لديك تطبيق classified-ad يتضمن مربع قائمة مع أسماء السيارات. يتم فرز في الإعلانات حسب العنوان الذي يكون عادةً صناعة السيارة.‬ مشكلة قد تواجهها تحدث عندما تقوم بعض السيارات بتضمين سنة السيارة قبل الصنع. المشكلة أن وظيفة الفرز المضمنة من مربع قائمة الفرز حسب رموز الأحرف فقط; يتم وضع كل الإعلانات مع بدء التواريخ أولاً، متبوعا بإعلانات بدء مع الصناعة.

لحل هذه المشكلة، يمكنك إنشاء إجراء فرز في فئة الذي يستخدم فرز الأحرف الهجائية القياسية على معظم مربعات القائمة ولكن يكون قادراً على التبديل بين وقت التشغيل إلى إجراء فرز مخصص لإعلانات السيارة. للقيام بذلك، قم بتمرير إجراء فرز مخصص إلى فئة الفرز وقت التشغيل باستخدام التفويضات.

AddressOf و تعابير لامدا

كل فئة مفوض تعرف دالة إنشاء التي تم تمريرها لمواصفات أسلوب الكائن. وسيطة لمنشئ مفوض يجب أن تكون مرجع لأسلوب، أو تعبير لامدا.

لتحديد مرجع لأسلوب، استخدم بناء الجملة التالي:

AddressOf [expression.]methodName

نوع وقت التحويل البرمجي expression يجب أن يكون اسم فئة أو واجهة تحتوي أسلوب الاسم المحدد الذي يتطابق توقيعه مع توقيع فئة المفوض, methodName يمكن أن يكون إما أسلوب مشترك أو أسلوب مثيل. methodName هو اختياري، حتى لو قمت بإنشاء مفوض للأسلوب الافتراضي للفئة.

لتحديد تعبير لامدا، استخدم بناء الجملة التالي:

Function ([parm مثل type, parm2 مثل type2, ...]) expression

يظهر المثال التالي كلا من AddressOf وتعبيرات لامدا استخدامه لتعيين مرجع التفويض.

Module Module1

    Sub Main()
        ' Create an instance of InOrderClass and assign values to the properties.
        ' InOrderClass method ShowInOrder displays the numbers in ascending 
        ' or descending order, depending on the comparison method you specify.
        Dim inOrder As New InOrderClass
        inOrder.Num1 = 5
        inOrder.Num2 = 4

        ' Use AddressOf to send a reference to the comparison function you want
        ' to use.
        inOrder.ShowInOrder(AddressOf GreaterThan)
        inOrder.ShowInOrder(AddressOf LessThan)

        ' Use lambda expressions to do the same thing.
        inOrder.ShowInOrder(Function(m, n) m > n)
        inOrder.ShowInOrder(Function(m, n) m < n)
    End Sub

    Function GreaterThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
        Return num1 > num2
    End Function

    Function LessThan(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
        Return num1 < num2
    End Function

    Class InOrderClass
        ' Define the delegate function for the comparisons.
        Delegate Function CompareNumbers(ByVal num1 As Integer, ByVal num2 As Integer) As Boolean
        ' Display properties in ascending or descending order.
        Sub ShowInOrder(ByVal compare As CompareNumbers)
            If compare(_num1, _num2) Then
                Console.WriteLine(_num1 & "  " & _num2)
            Else
                Console.WriteLine(_num2 & "  " & _num1)
            End If
        End Sub

        Private _num1 As Integer
        Property Num1() As Integer
            Get
                Return _num1
            End Get
            Set(ByVal value As Integer)
                _num1 = value
            End Set
        End Property

        Private _num2 As Integer
        Property Num2() As Integer
            Get
                Return _num2
            End Get
            Set(ByVal value As Integer)
                _num2 = value
            End Set
        End Property
    End Class
End Module

التوقيع الدالة يجب أن يطابق توقيع نوع المفوض. لمزيد من المعلومات حول تعبير لامدا، راجع تعبيرات لامدا. للحصول على مزيد من أمثلة التعبير لامدا و تعييات AddressOf إلى التفويضات, راجع تحويل حالة التفويض.

مواضيع ذات صلة

Title

الوصف

كيفية القيام بما يلي: استدعاء أسلوب تفويض

يوفّر مثال يُظهر كيفية إقران أسلوب مع مفوض ومن ثم استدعاء هذا الأسلوب خلال المفوّض.

كيفية القيام بما يلي: تمرير إجراءات إلى إجراء آخر في Visual Basic

يوضح كيفية استخدام التفويضات لتمرير إجراء واحدة إلى إجراء آخر.

تحويل حالة التفويض

توضح هذه المقالة كيف يمكن تعيين subs والدالات إلى المفوضين أو معالجات حتى عندما لا تتماثل التواقيع الخاصة بهم

الـأحداث (Visual Basic)

يـوفّر نظرة عامة حول التفويضات في Visual Basic.