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

حالة تفويض تحويل المقدمة في Visual Basic 2008، يمكنك تعيين subs و تفويضات الدالات أو المعالجات حتى عندما لا تتماثل التواقيع الخاصة بهم. لذلك، يصبح ربط تفويضات متناسقة مع ربط مسموح بالفعل لاستدعاء الأسلوب. 

معلمات و نوع الإرجاع

بدلاً من التطابق التام في توقيع، يتطلب تحويل حالة تحقق الشروط التالية عند تعيين Option Strict إلى On:

  • يجب أن يتواجد إجراء تحويل توسيعي من نوع بيانات كل معلمة تفويض لنوع البيانات للمعلمة المطابقة للدالة المعينة أو Sub. في المثال التالي تفويض Del1 يحتوي على معلمة واحدة Integer. معلمةm في تعبيرات لامدا المعينة يجب أن يكون نوع البيانات لإجراء التحويل التوسيعي من Integer، مثل Long أو Double.

    ' Definition of delegate Del1.
    Delegate Function Del1(ByVal arg As Integer) As Integer
    
    ' Valid lambda expression assignments with Option Strict on or off:
    
    ' Integer matches Integer.
    Dim d1 As Del1 = Function(m As Integer) 3
    
    ' Integer widens to Long
    Dim d2 As Del1 = Function(m As Long) 3
    
    ' Integer widens to Double
    Dim d3 As Del1 = Function(m As Double) 3
    

    مسموح فقط عند تحويل تضييقي Option Strict تعيين إلى Off.

    ' Valid only when Option Strict is off:
    
    Dim d4 As Del1 = Function(m As String) CInt(m)
    Dim d5 As Del1 = Function(m As Short) m
    
  • يجب أن يكون إجراء تحويل توسيعي موجوداً في الاتجاه المعاكس من نوع إرجاع دالة المعينة أو Sub نوع الإرجاع تفويض. في الأمثلة التالية، يجب تقييم نص كل تعبير لامدا المعينة إلى نوع البيانات التي تتوسع إلى Integer لأن نوع العائد del1 هو Integer.

    ' Valid return types with Option Strict on:
    
    ' Integer matches Integer.
    Dim d6 As Del1 = Function(m As Integer) m
    
    ' Short widens to Integer.
    Dim d7 As Del1 = Function(m As Long) CShort(m)
    
    ' Byte widens to Integer.
    Dim d8 As Del1 = Function(m As Double) CByte(m)
    

إذا Option Strict تتعيّن إلى Off، تتم إزالة تقييد توسيعي في كلا الاتجاهين.

' Valid only when Option Strict is set to Off.

' Integer does not widen to Short in the parameter.
Dim d9 As Del1 = Function(n As Short) n

' Long does not widen to Integer in the return type.
Dim d10 As Del1 = Function(n As Integer) CLng(n)

حذف مواصفات وسيطة معلمة

حالة المفوضين تسمح لك أيضاً بخذف كامل مواصفات معلمة في الأسلوب المعين:

' Definition of delegate Del2, which has two parameters.
Delegate Function Del2(ByVal arg1 As Integer, ByVal arg2 As String) As Integer
' The assigned lambda expression specifies no parameters, even though
' Del2 has two parameters. Because the assigned function in this 
' example is a lambda expression, Option Strict can be on or off.
' Compare the declaration of d16, where a standard function is assigned.
Dim d11 As Del2 = Function() 3

' The parameters are still there, however, as defined in the delegate.
Console.WriteLine(d11(5, "five"))

' Not valid.
' Console.WriteLine(d11())
' Console.WriteLine(d11(5))

لاحظ أنه لا يمكنك تحديد بعض المعلمات و حذف الآخرين.

' Not valid.
'Dim d12 As Del2 = Function(p As Integer) p

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

Sub OnClick(ByVal sender As Object, ByVal e As EventArgs) Handles b.Click
    MessageBox.Show("Hello World from" + b.Text)
End Sub

Sub RelaxedOnClick() Handles b.Click
    MessageBox.Show("Hello World from" + b.Text)
End Sub

أمثلة AddressOf

لامدا تستخدم تعبيرات في الأمثلة لإجراء نوع سهل لمعرفة العلاقات. على الرغم من ذلك، نفس الحالات تسمح لـ تفويض التعيينات التي تستخدم AddressOf, Handles، أو AddHandler.

في المثال التالي، وظائف f1, f2, f3، و f4 يمكن أن يتم تعيين الكل إلى Del1.

' Definition of delegate Del1.
Delegate Function Del1(ByVal arg As Integer) As Integer
' Definitions of f1, f2, f3, and f4.
Function f1(ByVal m As Integer) As Integer
End Function

Function f2(ByVal m As Long) As Integer
End Function

Function f3(ByVal m As Integer) As Short
End Function

Function f4() As Integer
End Function
' Assignments to function delegate Del1.

' Valid AddressOf assignments with Option Strict on or off:

' Integer parameters of delegate and function match.
Dim d13 As Del1 = AddressOf f1

' Integer delegate parameter widens to Long.
Dim d14 As Del1 = AddressOf f2

' Short return in f3 widens to Integer.
Dim d15 As Del1 = AddressOf f3

المثال التالي صالح فقط عند تعيين Option Strict إلى Off.

' If Option Strict is Off, parameter specifications for f4 can be omitted.
Dim d16 As Del1 = AddressOf f4

' Function d16 still requires a single argument, however, as specified
' by Del1.
Console.WriteLine(d16(5))

' Not valid.
'Console.WriteLine(d16())
'Console.WriteLine(d16(5, 3))

إرجاع دالة الإفلات

تحويل حالة المفوض يمكنّك من تعيين دالة إلى تفويض Sub بشكل فعال مع تجاهل القيمة المرجعة للدالة. ومع ذلك، لا يمكنك تعيين Sub إلى مفوض دالة. في المثال التالي عنوان الدالة doubler يتم تعيينها إلى Sub تفويض Del3.

' Definition of Sub delegate Del3.
Delegate Sub Del3(ByVal arg1 As Integer)

' Definition of function doubler, which both displays and returns the
' value of its integer parameter.
Function doubler(ByVal p As Integer) As Integer
    Dim times2 = 2 * p
    Console.WriteLine("Value of p: " & p)
    Console.WriteLine("Double p:   " & times2)
    Return times2
End Function
' You can assign the function to the Sub delegate:
Dim d17 As Del3 = AddressOf doubler

' You can then call d17 like a regular Sub procedure.
d17(5)

' You cannot call d17 as a function. It is a Sub, and has no 
' return value.
' Not valid.
'Console.WriteLine(d17(5))

راجع أيضًا:

المهام

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

المرجع

كشف الخيار الصارمِ

المبادئ

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

توسيع و تضييق التحويلات

استدلال الـنوع المحلي

موارد أخرى

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