| hoofdstuk |
32. 33. 34.  |
| onderwerp |
32.3. 33.1. Anonymous Types 33.2.  |
| rubrieken | 

|
Dit artikel is gepubliceerd op zondag 31 juli 2011 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 2010 Broncode Option Infer OnOption Strict OnClass 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} 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} Console.WriteLine(address7.City) Console.WriteLine(address7.Street) Console.WriteLine(address7.Number) Dim address8 = New With {SomeSecondClass.City, SomeSecondClass.Street, _ SomeSecondClass.Number} 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 SubEnd ClassClass 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 FunctionEnd ClassClass 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 FunctionEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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. 33.1.1. Key PropertiesKey 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 2010 Broncode 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)) Console.WriteLine(counter1.Equals(counter2)) 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)) Console.WriteLine(counter3.Equals(counter5)) Console.WriteLine(counter1.ToString()) Console.WriteLine(counter5.ToString()) Console.ReadLine() End SubEnd ClassDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
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. boven
33.1.2. Wanneer Anonymous Types GebruikenDe 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 zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|