Conversion simplifiée des délégués (Visual Basic)

La conversion de délégués détendue vous permet d’attribuer des sous-fonctions aux délégués ou aux gestionnaires même si leurs signatures ne sont pas identiques. Par conséquent, la liaison aux délégués devient cohérente avec la liaison déjà autorisée pour les appels de méthode.

Paramètres et type de retour

À la place d’une correspondance exacte de signature, la conversion détendue nécessite que les conditions suivantes soient remplies lorsqu’elles Option Strict sont définies sur On:

  • Une conversion étendue doit exister du type de données de chaque paramètre délégué au type de données du paramètre correspondant de la fonction affectée ou Sub. Dans l’exemple suivant, le délégué Del1 a un paramètre, un Integer. Le paramètre m dans les expressions lambda affectées doit avoir un type de données pour lequel il existe une conversion étendue à partir Integerde , par exemple Long ou 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
    

    Les conversions de réduction sont autorisées uniquement lorsqu’elles Option Strict sont définies sur 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
    
  • Une conversion étendue doit exister dans la direction opposée du type de retour de la fonction affectée ou Sub du type de retour du délégué. Dans les exemples suivants, le corps de chaque expression lambda affectée doit évaluer un type de données qui s’étend à Integer parce que le type de retour est del1Integer.

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

Si Option Strict elle est définie sur Off, la restriction étendue est supprimée dans les deux sens.

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

Omettre les spécifications des paramètres

Les délégués détendus vous permettent également d’omettre complètement les spécifications de paramètre dans la méthode affectée :

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

Notez que vous ne pouvez pas spécifier certains paramètres et omettre d’autres.

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

La possibilité d’omettre des paramètres est utile dans une situation telle que la définition d’un gestionnaire d’événements, où plusieurs paramètres complexes sont impliqués. Les arguments de certains gestionnaires d’événements ne sont pas utilisés. Au lieu de cela, le gestionnaire accède directement à l’état du contrôle sur lequel l’événement est inscrit et ignore les arguments. Les délégués détendus vous permettent d’omettre les arguments dans ces déclarations lorsqu’aucun résultat ambiguïté n’est obtenu. Dans l’exemple suivant, la méthode OnClick entièrement spécifiée peut être réécrite en tant que 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  

Exemples AddressOf

Les expressions lambda sont utilisées dans les exemples précédents pour faciliter l’affichage des relations de type. Toutefois, les mêmes détentes sont autorisées pour les affectations déléguées qui utilisent AddressOf, Handlesou AddHandler.

Dans l’exemple suivant, fonctions f1, f2, f3et f4 peut tous être attribué à 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

L’exemple suivant est valide uniquement lorsqu’il Option Strict est défini sur 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))

Suppression de la fonction retourne

La conversion de délégué détendue vous permet d’attribuer une fonction à un Sub délégué, en ignorant efficacement la valeur de retour de la fonction. Toutefois, vous ne pouvez pas affecter un Sub délégué de fonction. Dans l’exemple suivant, l’adresse de la fonction doubler est affectée au Sub délégué 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))

Voir aussi