|
Dit artikel is gepubliceerd op zondag 31 juli 2011 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 2010 Broncode Option Strict OffClass Counter Private m_Value As Short Public Sub New( ByVal value As Short) m_Value = value End Sub Public ReadOnly Property Value() As Short Get Value = m_Value End Get End Property Public Sub Raise() m_Value = System.Convert.ToInt16(m_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 OperatorEnd ClassClass 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 Console.WriteLine(delegate1a.Invoke(1)) Dim delegate1b As Delegate1 = AddressOf Method2 Console.WriteLine(delegate1b.Invoke(1)) Dim delegate1c As Delegate1 = AddressOf Method3 Console.WriteLine(delegate1c.Invoke(1)) Dim delegate1d As Delegate1 = AddressOf Method4 Console.WriteLine(delegate1d.Invoke(1)) Dim delegate1e As Delegate1 = AddressOf Method5 Console.WriteLine(delegate1e.Invoke(1)) Dim delegate1f As Delegate1 = AddressOf Method6 Console.WriteLine(delegate1f.Invoke(1)) Dim delegate1g As Delegate1 = AddressOf Method7 Console.WriteLine(delegate1g.Invoke(1)) Dim delegate2a As Delegate2 = AddressOf Method1 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 FunctionEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output Method1
1
2
3
4
5
6
7
Method1 24.5.1. Relaxing door Conversie tussen DatatypesVerschillende 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 ). boven
24.5.2. Relaxing door het Weglaten van Parameter SpecificatiesHet 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. boven
24.5.3. Relaxing door het Weglaten van ReturnwaardeHet 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. boven
24.5.4. EventhandlersVooral 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 2010 Broncode Class Button Public Event Click As EventHandler( Of EventArgs) Protected Sub OnClick() RaiseEvent Click( Me, EventArgs.Empty) End Sub Public Sub SimulateClick() OnClick() End SubEnd ClassClass 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 SubEnd ClassClass 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 SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output Form.Button1_Click
Example2.Button1_Click Het is nu echter ook mogelijk om de parameter specificaties weg te laten. Visual Basic 2010 Broncode Partial Class Form Friend WithEvents Button2 As New Button Private Sub Button2_Click() Handles Button2.Click Console.WriteLine( "Form.Button2_Click") End SubEnd ClassClass Example3 Public Shared Sub Main() Dim form1 As New Form AddHandler form1.Button2.Click, AddressOf Button2_Click form1.Button2.SimulateClick() Console.ReadLine() End Sub Private Shared Sub Button2_Click() Console.WriteLine( "Example2.Button2_Click") End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output Form.Button2_Click
Example2.Button2_Click
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|