Bagikan melalui


Konversi Delegasi Longgar (Visual Basic)

Konversi delegasi yang dilonggarkan memungkinkan Anda menetapkan sub dan fungsi untuk mendelegasikan atau menangani bahkan ketika tanda tangan mereka tidak identik. Oleh karena itu, pengikatan ke delegasi menjadi selaras dengan pengikatan yang telah diizinkan untuk proses pemanggilan metode.

Parameter dan Jenis Pengembalian

Sebagai ganti kecocokan tanda tangan yang tepat, konversi yang dilonggarkan mengharuskan kondisi berikut terpenuhi ketika Option Strict diatur ke On:

  • Konversi yang melebar harus ada dari jenis data setiap parameter delegasi ke jenis data parameter yang sesuai dari fungsi yang ditetapkan atau Sub. Dalam contoh berikut, delegasi Del1 memiliki satu parameter, yaitu Integer. Dalam ekspresi lambda yang ditetapkan, parameter m harus memiliki jenis data yang memiliki konversi pelebaran dari Integer, seperti Long atau 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
    

    Konversi yang mempersempit hanya diizinkan ketika Option Strict diatur ke 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
    
  • Konversi tipe yang lebih luas harus ada dari arah yang berlawanan dari tipe pengembalian fungsi yang ditetapkan atau Sub ke tipe pengembalian delegate. Dalam contoh berikut, isi setiap ekspresi lambda yang ditetapkan harus dievaluasi ke jenis data yang dapat diperluas kepada Integer karena tipe pengembalian del1 adalah 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)
    

Jika Option Strict diatur ke Off, pembatasan perluasan dihapus di semua arah.

' 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)

Mengabaikan Spesifikasi Parameter

Delegasi yang dilonggarkan juga memungkinkan Anda untuk sepenuhnya menghilangkan spesifikasi parameter dalam metode yang ditetapkan:

' 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))

Perhatikan bahwa Anda tidak dapat menentukan beberapa parameter dan menghilangkan yang lain.

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

Kemampuan untuk menghilangkan parameter sangat membantu dalam situasi seperti menentukan penanganan aktivitas, di mana beberapa parameter kompleks terlibat. Argumen untuk beberapa penanganan aktivitas tidak digunakan. Sebagai gantinya, handler langsung mengakses status kontrol tempat peristiwa didaftarkan, dan mengabaikan argumen. Delegasi longgar memungkinkan Anda untuk menghilangkan argumen dalam deklarasi semacam itu ketika tidak menghasilkan ambiguitas. Dalam contoh berikut, metode OnClick yang sepenuhnya ditentukan dapat ditulis ulang sebagai 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  

Contoh AddressOf

Ekspresi Lambda digunakan dalam contoh sebelumnya untuk membuat hubungan jenis mudah dilihat. Namun, relaksasi yang sama diizinkan untuk mendelegasikan penugasan yang menggunakan AddressOf, Handles, atau AddHandler.

Dalam contoh berikut, fungsi f1, , f2f3, dan f4 semuanya dapat ditetapkan ke 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

Contoh berikut hanya valid ketika Option Strict diatur ke 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))

Menjatuhkan Fungsi Mengembalikan

Konversi delegasi yang dilonggarkan memungkinkan Anda menetapkan fungsi ke Sub delegasi, mengabaikan secara efektif nilai pengembalian dari fungsi tersebut. Namun, Anda tidak dapat menetapkan Sub ke delegasi fungsi. Dalam contoh berikut, alamat fungsi doubler ditetapkan untuk Sub mendelegasikan 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))

Lihat juga