Dela via


Definition av anonym typ (Visual Basic)

Som svar på deklarationen av en instans av en anonym typ skapar kompilatorn en ny klassdefinition som innehåller de angivna egenskaperna för typen.

Kompilatorgenererad kod

För följande definition av productskapar kompilatorn en ny klassdefinition som innehåller egenskaperna Name, Priceoch OnHand.

' Variable product is an instance of an anonymous type.
Dim product = New With {Key .Name = "paperclips", Key .Price = 1.29, .OnHand = 24}

Klassdefinitionen innehåller egenskapsdefinitioner som liknar följande. Observera att det inte finns någon Set metod för nyckelegenskaperna. Värdena för nyckelegenskaper är skrivskyddade.

Public Class $Anonymous1
    Private _name As String
    Private _price As Double
    Private _onHand As Integer
     Public ReadOnly Property Name() As String
        Get
            Return _name
        End Get
    End Property

    Public ReadOnly Property Price() As Double
        Get
            Return _price
        End Get
    End Property

    Public Property OnHand() As Integer
        Get
            Return _onHand
        End Get
        Set(ByVal Value As Integer)
            _onHand = Value
        End Set
    End Property

End Class

Dessutom innehåller anonyma typdefinitioner en parameterlös konstruktor. Konstruktorer som kräver parametrar är inte tillåtna.

Om en anonym typdeklaration innehåller minst en nyckelegenskap åsidosätter typdefinitionen tre medlemmar som ärvts från Object: Equals, GetHashCodeoch ToString. Om inga nyckelegenskaper deklareras åsidosättas endast ToString . Åsidosättningarna tillhandahåller följande funktioner:

  • Equals returnerar True om två anonyma typinstanser är samma instans, eller om de uppfyller följande villkor:

    • De har samma antal egenskaper.

    • Egenskaperna deklareras i samma ordning, med samma namn och samma härledda typer. Namnjämförelser är inte skiftlägeskänsliga.

    • Minst en av egenskaperna är en nyckelegenskap och nyckelordet Key tillämpas på samma egenskaper.

    • Jämförelse av varje motsvarande par med nyckelegenskaper returnerar True.

      I följande exempel returneras EqualsTrue till exempel endast för employee01 och employee08. Kommentaren före varje rad anger orsaken till att den nya instansen inte matchar employee01.

      Dim employee01 = New With {Key .Name = "Bob", Key .Category = 3, .InOffice = False}
      
      ' employee02 has no InOffice property.
      Dim employee02 = New With {Key .Name = "Bob", Key .Category = 3}
      
      ' The first property has a different name.
      Dim employee03 = New With {Key .FirstName = "Bob", Key .Category = 3, .InOffice = False}
      
      ' Property Category has a different value.
      Dim employee04 = New With {Key .Name = "Bob", Key .Category = 2, .InOffice = False}
      
      ' Property Category has a different type.
      Dim employee05 = New With {Key .Name = "Bob", Key .Category = 3.2, .InOffice = False}
      
      ' The properties are declared in a different order.
      Dim employee06 = New With {Key .Category = 3, Key .Name = "Bob", .InOffice = False}
      
      ' Property Category is not a key property.
      Dim employee07 = New With {Key .Name = "Bob", .Category = 3, .InOffice = False}
      
      ' employee01 and employee 08 meet all conditions for equality. Note 
      ' that the values of the non-key field need not be the same.
      Dim employee08 = New With {Key .Name = "Bob", Key .Category = 2 + 1, .InOffice = True}
      
      ' Equals returns True only for employee01 and employee08.
      Console.WriteLine(employee01.Equals(employee08))
      
  • GetHashcode tillhandahåller en lämpligt unik GetHashCode-algoritm. Algoritmen använder endast nyckelegenskaperna för att beräkna hash-koden.

  • ToString returnerar en sträng med sammanfogade egenskapsvärden, enligt följande exempel. Både nyckel- och icke-nyckelegenskaper ingår.

    Console.WriteLine(employee01.ToString())
    Console.WriteLine(employee01)
    ' The preceding statements both display the following:
    ' { Name = Bob, Category = 3, InOffice = False }
    

Explicit namngivna egenskaper av en anonym typ kan inte vara i konflikt med dessa genererade metoder. Du kan alltså inte använda .Equals, .GetHashCodeeller .ToString för att namnge en egenskap.

Definitioner av anonym typ som innehåller minst en nyckelegenskap implementerar System.IEquatable<T> också gränssnittet, där T är typen av anonym typ.

Kommentar

Anonyma typdeklarationer skapar endast samma anonyma typ om de inträffar i samma sammansättning, deras egenskaper har samma namn och samma härledda typer, egenskaperna deklareras i samma ordning och samma egenskaper markeras som nyckelegenskaper.

Se även