Visual Basic 2012 Voorbeelden
   

visual basic 2012 broncode voorbeelden

Blijf op de hoogte van de recente aanpassingen op vbvoorbeelden!

Microsoft Visual Studio 2012Microsoft Developers Network - Visual BasicMicrosoft .NET Framework

24.5. Relaxed Delegates

Print Email Deel op Twitter Deel op Facebook

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.

Sinds Visual Basic 9.0 (2008) is het mogelijk delegate instanties te laten wijzen naar methods met een signatuur die niet exact overeenkomt met wat het delegatetype heeft gedefinieerd.
Visual Basic 2012 Broncode - Codevoorbeeld 645
Option Strict Off
Class Counter
    Private _Value As Short
    Public Sub New(ByVal value As Short)
        _Value = value
    End Sub
    Public ReadOnly Property Value() As Short
        Get
            Value = _Value
        End Get
    End Property
    Public Sub Raise()
        _Value = System.Convert.ToInt16(_Value + 1)
    End Sub
    Public Shared Widening Operator CType(ByVal counter As Counter) As Integer
        Return counter.Value
    End Operator
    Public Shared Narrowing Operator CType(ByVal value As Integer) As Counter
        Return New Counter(System.Convert.ToInt16(value))
    End Operator
End Class
Class Example1
    Public Delegate Function Delegate1(ByVal argument1 As Integer) As Integer
    Public Delegate Sub Delegate2(ByVal argument1 As Integer)
    Public Shared Sub Main()
        Dim delegate1a As Delegate1 = AddressOf Method1                    ' (1)
        Console.WriteLine(delegate1a.Invoke(1))
        '
        Dim delegate1b As Delegate1 = AddressOf Method2                    ' (2)
        Console.WriteLine(delegate1b.Invoke(1))
        '
        Dim delegate1c As Delegate1 = AddressOf Method3                    ' (3)
        Console.WriteLine(delegate1c.Invoke(1))
        '
        Dim delegate1d As Delegate1 = AddressOf Method4                    ' (4)
        Console.WriteLine(delegate1d.Invoke(1))
        '
        Dim delegate1e As Delegate1 = AddressOf Method5                    ' (5)
        Console.WriteLine(delegate1e.Invoke(1))
        '
        Dim delegate1f As Delegate1 = AddressOf Method6                    ' (6)
        Console.WriteLine(delegate1f.Invoke(1))
        '
        Dim delegate1g As Delegate1 = AddressOf Method7                    ' (7)
        Console.WriteLine(delegate1g.Invoke(1))
        '
        Dim delegate2a As Delegate2 = AddressOf Method1                    ' (8)
        delegate2a.Invoke(1)
        '
        Console.ReadLine()
    End Sub
    Public Shared Function Method1() As Integer
        Console.WriteLine("Method1")
        Method1 = 1
    End Function
    Public Shared Function Method2(ByVal argument1 As Long) As Integer
        Method2 = 2
    End Function
    Public Shared Function Method3(ByVal argument1 As Short) As Integer
        Method3 = 3
    End Function
    Public Shared Function Method4(ByVal argument1 As Integer) As Short
        Method4 = 4
    End Function
    Public Shared Function Method5(ByVal argument1 As Integer) As Long
        Method5 = 5
    End Function
    Public Shared Function Method6(ByVal argument1 As Counter) As Integer
        Method6 = 6
    End Function
    Public Shared Function Method7(ByVal argument1 As Integer) As Counter
        Method7 = New Counter(7)
    End Function
End Class
Console Application Output
Method1
1
2
3
4
5
6
7
Method1

24.5.1. Relaxing door Conversie tussen Datatypes

Verschillende datatypes voor de parameters of returnwaarde zijn toegestaan zolang conversie tussen deze datatypes mogelijk is.  Met Option Strict On zal uiteraard enkel widening conversie worden toegelaten.

Met Option Strict On (of Off) is (2), (4) en (7) toegestaan :

(2) delegate1b van type Delegate1 (die een Integer argument in de method verwacht) kan wijzen naar een function met een argument van een datatype waarnaartoe - startende van Integer - men via widening conversie kan omzetten.  Het blijft echter zo dat bij het invokeren van delegate1b men als parameterwaarde een Integer expressie moet doorgeven.
Maar elke Integer expressie kan probleemloos worden voorgesteld in een variabele van het type Long.

(4)(7) delegate1d en delegate1g van type Delegate1 (die een Integer waarde oplevert) kan wijzen naar een function die als returntype een type heeft waarvan men via widening conversie naar Integer kan omzetten.  Het blijft echter zo dat de call naar delegate1d en delegate1g een Integer expressie is.
Maar elke Integer expressie kan probleemloos een waarde voorstellen van type Short en Counter.

Met Option Strict Off is (3), (5) en (6) toegestaan :

(3)(6) delegate1c en delegate1f van type Delegate1 (die normaal gezien een Integer argument in de method verwacht) kan wijzen naar een function met een argument van een ander datatype waarnaartoe converteren mogelijk is.
Het blijft echter zo dat bij het invokeren van delegate1c of delegate1f men als parameterwaarde een Integer expressie moet doorgeven.  Zolang de doorgegeven Integer waarde hier te representeren valt onder type Short (3) of Counter (6) zal de invocatie van deze method geen problemen opleveren (narrowing conversie, dus niet toegestaan bij Option Strict On).

(5) delegate1e van type Delegate1 (die normaal gezien een Integer waarde oplevert) kan wijzen naar een functie die een returntype heeft waarvan men kan converteren naar Integer.  Het blijft echter zo dat de call naar delegate1e een Integer expressie is.
Zolang de hier opgeleverde Long waarde te representeren valt onder Integer vorm zal de uitvoering van deze method geen problemen opleveren ( narrowing conversie, dus niet toegestaan bij Option Strict On).

24.5.2. Relaxing door het Weglaten van Parameter Specificaties

Het weglaten van parameter specificaties in de methods waarnaartoe delegate instanties verwijzen is toegelaten bij Option Strict Off.  Ofwel worden alle parameters gespecificeerd ofwel geen enkele.

Met Option Strict Off is ook (1) toegestaan :

(1) delegate1a van type Delegate1 (die normaal gezien een Integer argument in de method verwacht) kan wijzen naar een function waarin geen argumenten zijn gespecificeerd.  Het blijft echter zo dat bij het invokeren van delegate1a men als parameter een Integer waarde moet doorgeven, deze argumentwaarde wordt niet gebruikt.

24.5.3. Relaxing door het Weglaten van Returnwaarde

Het wijzen naar een functie (Function) in een delegate instantie van een delegatetype die normaal gezien verwijst naar procedures (Subs) is toegelaten bij Option Strict Off.

Met Option Strict Off is ook (8) toegestaan :

(8) delegate2a van type Delegate2 (die normaal gezien geen returnwaarde heeft, want Sub) kan wijzen naar een method met een returnwaarde (Function).  Het blijft echter zo dat het invokeren van delegate2a een aanroep naar een procedure (Sub) is, en deze call dus geen expressie is, de terugkeerwaarde zal hier dus niet gebruikt worden.

24.5.4. Eventhandlers

Vooral de relaxatie door het weglaten van parameter specificaties is handig bij het definiëren van eventhandlers.
Vaak is het immers zo dat de doorgegeven argumentwaarden in de eventhandlers toch niet gebruikt worden.

In onderstaand voorbeeld is de signatuur van de eventhandlers Form.Button1_Click en Example2.Button1_Click identiek aan deze van de door de event gecreëerde delegatetype.
Visual Basic 2012 Broncode - Codevoorbeeld 646
Class Button
    'Public Delegate Sub ClickDelegate(ByVal sender As Object, _
    '                                  ByVal e As EventArgs)
    'Public Event Click As ClickDelegate
    ' or shorter :
    Public Event Click As EventHandler(Of EventArgs)
    Protected Sub OnClick()
        RaiseEvent Click(Me, EventArgs.Empty)
    End Sub
    Public Sub SimulateClick()
        OnClick()
    End Sub
End Class
Class Form
    Friend WithEvents Button1 As New Button
    Private Sub Button1_Click(ByVal sender As Object, _
                              ByVal e As EventArgs) Handles Button1.Click
        Console.WriteLine("Form.Button1_Click")
    End Sub
End Class
Class Example2
    Public Shared Sub Main()
        Dim form1 As New Form
        AddHandler form1.Button1.Click, AddressOf Button1_Click
        form1.Button1.SimulateClick()
        '
        Console.ReadLine()
    End Sub
    Private Shared Sub Button1_Click(ByVal sender As Object, _
                                     ByVal e As EventArgs)
        Console.WriteLine("Example2.Button1_Click")
    End Sub
End Class
Console Application Output
Form.Button1_Click
Example2.Button1_Click
Het is nu echter ook mogelijk om de parameter specificaties weg te laten.
Visual Basic 2012 Broncode - Codevoorbeeld 647
Partial Class Form
    Friend WithEvents Button2 As New Button
    Private Sub Button2_Click() Handles Button2.Click                      ' (1)
        Console.WriteLine("Form.Button2_Click")
    End Sub
End Class
Class Example3
    Public Shared Sub Main()
        Dim form1 As New Form
        AddHandler form1.Button2.Click, AddressOf Button2_Click            ' (2)
        form1.Button2.SimulateClick()
        '
        Console.ReadLine()
    End Sub
    Private Shared Sub Button2_Click()
        Console.WriteLine("Example2.Button2_Click")
    End Sub
End Class
Console Application Output
Form.Button2_Click
Example2.Button2_Click

Dit artikel is gepubliceerd op maandag 15 oktober 2012 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.