Gevşek Temsilci Dönüşümü (Visual Basic)

Gevşek temsilci dönüştürme, imzaları aynı olmasa bile temsilcilere veya işleyicilere alt öğeler ve işlevler atamanızı sağlar. Bu nedenle, temsilcilere bağlama yöntemi çağrıları için izin verilen bağlama ile tutarlı hale gelir.

Parametreler ve Dönüş Türü

Tam imza eşleşmesi yerine, gevşek dönüştürme, olarak ayarlandığında Onaşağıdaki koşulların karşılanmasını Option Strict gerektirir:

  • Her temsilci parametresinin veri türünden atanan işlevin veya Suböğesine karşılık gelen parametrenin veri türüne genişletme dönüştürmesi bulunmalıdır. Aşağıdaki örnekte, temsilcinin Del1 bir parametresi vardır: .Integer Atanan lambda ifadelerindeki parametrem, veya Doublegibi Long türünden Integergenişletme dönüştürmesi olan bir veri türüne sahip olmalıdır.

    ' 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
    

    Daraltma dönüştürmelerine yalnızca Option Strict olarak ayarlandığında Offizin verilir.

    ' 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
    
  • Bir genişletme dönüştürmesi, atanan işlevin dönüş türünden veya Sub temsilcinin dönüş türüne ters yönde bulunmalıdır. Aşağıdaki örneklerde, döndürülen türü olduğundan atanan her lambda ifadesinin gövdesi genişletilen Integer bir veri türü olarak del1Integerdeğerlendirilmelidir.

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

olarak ayarlanırsa Option StrictOff, genişletme kısıtlaması her iki yönde de kaldırılır.

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

Parametre Belirtimlerini Atlama

Gevşek temsilciler, atanan yöntemde parametre belirtimlerini tamamen atlamanıza da olanak sağlar:

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

Bazı parametreleri belirtemeyeceğinizi ve diğerlerini atlayamayacağınızı unutmayın.

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

Parametreleri atlayabilme özelliği, çeşitli karmaşık parametrelerin dahil olduğu bir olay işleyicisi tanımlama gibi bir durumda yararlıdır. Bazı olay işleyicilerinin bağımsız değişkenleri kullanılmaz. Bunun yerine işleyici, olayın kaydedildiği denetimin durumuna doğrudan erişir ve bağımsız değişkenleri yoksayar. Gevşek temsilciler, belirsizlik sonucu olmadığında bu tür bildirimlerdeki bağımsız değişkenleri atlamanıza olanak sağlar. Aşağıdaki örnekte, tam olarak belirtilen yöntem OnClick olarak RelaxedOnClickyeniden yazılabilir.

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 Örnekleri

Lambda ifadeleri, önceki örneklerde tür ilişkilerinin görülmesini kolaylaştırmak için kullanılır. Ancak, , Handlesveya AddHandlerkullanan AddressOftemsilci atamaları için de aynı rahatlamalara izin verilir.

Aşağıdaki örnekte, , f2, f3ve f4 işlevlerine Del1f1atanabilir.

' 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

Aşağıdaki örnek yalnızca Option Strict olarak ayarlandığında Offgeçerlidir.

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

İşlev Döndürülüyor

Gevşek temsilci dönüştürme, işlevi temsilciye Sub atamanıza olanak tanır ve işlevin dönüş değerini etkin bir şekilde yoksayabilirsiniz. Ancak, bir işlev temsilcisine atayamazsınız Sub . Aşağıdaki örnekte işlevin doubler adresi temsilcisine SubDel3atanır.

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

Ayrıca bkz.