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

14.11. Anonymous Types

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.

Het is mogelijk objecten te creëren van ongedefinieerde types.  Deze ongedefinieerde types hebben geen naam, of zijn dus "anoniem".

Het gebruik van een object initializer voor het creëren van een object van een anoniem type is enkel mogelijk/zinnig indien men via With de properties definieert en initialiseert.
Visual Basic 2012 Broncode - Codevoorbeeld 394
Option Infer On
Option Strict On
Class Example1
    Public Shared Sub Main()
        Dim address1 = New With {.City = "New York", .Street = "Parklane"}
        Console.WriteLine(address1.City)
        Console.WriteLine(address1.Street)
        '
        Dim address2 = New With {.City = "London", .Street = "Oxford Street"}
        Console.WriteLine(address2.City)
        Console.WriteLine(address2.Street)
        '
        Dim address3 = New With {.City = "San Fransico", .Street = 10}
        Console.WriteLine(address3.City)
        Console.WriteLine(address3.Street)
        '
        Dim address4 = New With {.City = "Paris"}
        Console.WriteLine(address4.City)
        '
        Dim city As String = "Brussels"
        Dim address5 = New With {city}                                     ' (1)
        Console.WriteLine(address5.City)
        address5.City = "Amsterdam"
        Console.WriteLine(address5.City)
        '
        Dim someInstance As New SomeFirstClass
        Dim address6 = New With {someInstance.City, someInstance.Street()}
        Console.WriteLine(address6.City)
        Console.WriteLine(address6.Street)
        '
        Dim address7 = New With {someInstance.City, someInstance.Street(), _
                                 someInstance.Number}                      ' (2)
        Console.WriteLine(address7.City)
        Console.WriteLine(address7.Street)
        Console.WriteLine(address7.Number)
        '
        Dim address8 = New With {SomeSecondClass.City, SomeSecondClass.Street, _
                                 SomeSecondClass.Number}                   ' (3)
        Console.WriteLine(address8.City)
        Console.WriteLine(address8.Street)
        Console.WriteLine(address8.Number)
        '
        Console.WriteLine(address1.GetType().Equals(address2.GetType()))
        Console.WriteLine(address1.GetType().Equals(address3.GetType()))
        Console.WriteLine(address1.GetType().Equals(address4.GetType()))
        Console.WriteLine(address4.GetType().Equals(address5.GetType()))
        Console.WriteLine(address1.GetType().Equals(address6.GetType()))
        '
        Console.ReadLine()
    End Sub
End Class
Class SomeFirstClass
    Public Number As Integer
    Public ReadOnly Property City() As String
        Get
            City = "someCity"
        End Get
    End Property
    Public Function Street() As String
        Street = "someStreet"
    End Function
End Class
Class SomeSecondClass
    Public Shared Number As Integer
    Public Shared ReadOnly Property City() As String
        Get
            City = "someCity"
        End Get
    End Property
    Public Shared Function Street() As String
        Street = "someStreet"
    End Function
End Class
Console Application Output
New York
Parklane
London
Oxford Street
San Fransico
10
Paris
Brussels
Amsterdam
someCity
someStreet
someCity
someStreet
0
someCity
someStreet
0
True
False
False
True
True
Steeds wordt type inference gebruikt om het type van de properties vast te leggen.  De properties zijn dus strongly typed.  Minimaal één property is vereist.  Indien men meerdere properties definieert, spreekt het voor zich dat elke property een unieke naam moet hebben.

(1) Variabelen kunnen gebruikt worden om zowel de identifier van de property te bepalen, als de initialisatiewaarde te bepalen.

(2)(3) Shared of instance velden, properties en functies kunnen gebruikt worden om de identifier en waarde voor de property te bepalen.  De properties en functies moeten dan wel parameterloos zijn.

De properties die in het anonieme type gecreëerd worden zijn altijd readable en writeable.  Tenzij het Key properties zijn (zie verderop).

De naam van het anonieme type wordt door de compiler zelf bepaald, en kan/mag niet gebruikt worden in je code.

Het anoniem type erft rechtstreeks van Object over.

Gezien de identifier niet gekend is, kan men bij de declaratie van de objectvariabele (hier address1) geen type specifier gebruiken.  Ook dit datatype wordt via type inference bepaald.

Meerdere objecten van anonieme types worden van een gelijk type beschouwd indien ze in dezelfde assembly werden gecreëerd en dezelfde object initializer werd gebruikt.  Met dezelfde properties ( identifiers voor deze properties), die inferred worden naar dezelfde datatypes, en die in dezelfde volgorde staan gedefinieerd, met dezelfde Keys.

14.11.1. Key Properties

De Key properties zijn readonly en worden gebruikt in de Equals implementatie om te zien of twee instanties (van hetzelfde anonieme type) logisch gezien gelijk zijn aan elkaar.
Visual Basic 2012 Broncode - Codevoorbeeld 395
Class Example2
    Public Shared Sub Main()
        Dim counter1 = New With {.Value = 0, .StepValue = 1}
        Dim counter2 = New With {.Value = 0, .StepValue = 1}
        Console.WriteLine(counter1.Equals(counter1))                       ' (1)
        Console.WriteLine(counter1.Equals(counter2))                       ' (2)
        '
        Dim counter3 = New With {Key .Value = 0, .StepValue = 1}
        Dim counter4 = New With {Key .Value = 0, .StepValue = 2}
        Dim counter5 = New With {Key .Value = 10, .StepValue = 1}
        Console.WriteLine(counter3.Equals(counter4))                       ' (3)
        Console.WriteLine(counter3.Equals(counter5))
        'counter5.Value = 11                                               ' (4)
        '
        Console.WriteLine(counter1.ToString())                             ' (5)
        Console.WriteLine(counter5.ToString())
        '
        Console.ReadLine()
    End Sub
End Class
Console Application Output
True
False
True
False
{ Value = 0, StepValue = 1 }
{ Value = 10, StepValue = 1 }
(1) Een instantie van een anoniem type zonder key properties is enkel gelijk aan zichzelf.  Zelfs indien een andere instantie van hetzelfde anonieme type dezelfde toestand (veldwaarden) bevat, wordt deze andere instantie nog niet als logisch gelijk beschouwd (2).

(3) Twee instanties van hetzelfde anonieme type worden als logisch gelijk beschouwd indien ze dezelfde Key propertywaardes bevatten.

(4) Key properties zijn readonly.  Probeert men toch een waarde toe te kennen aan deze property dan krijgt men at compiletime een fout.

Elk anoniem type overschrijft op zijn minst de van Object overgeërfde ToString implementatie (5).

Elk anoniem type met op zijn minst 1 key property overschrijft op de van Object overgeërfde Equals en GetHashCode.

14.11.2. Wanneer Anonymous Types Gebruiken

De mogelijkheden van anonieme types zijn erg beperkt, ze kunnen enkel properties bevatten.  Objecten van anonieme types kan je dus slecht als een eenvoudige container van enkele eigenschappen gebruiken.
Indien andere soorten van members noodzakelijk zijn zal men een normaal ( "named") type moeten gebruiken.

Gezien men ook nergens kan verwijzen naar de naam van dit anonieme type is het ook niet geschikt om als informatie object door te geven tussen verschillende methods.

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