Megosztás a következőn keresztül:


Névtelen típusdefiníció (Visual Basic)

Egy névtelen típusú példány deklarációjára válaszul a fordító létrehoz egy új osztálydefiníciót, amely tartalmazza a típus megadott tulajdonságait.

Compiler-Generated kód

A következő definícióhoz producta fordító létrehoz egy új osztálydefiníciót, amely tulajdonságokat Nametartalmaz , Priceés OnHand.

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

Az osztálydefiníció az alábbihoz hasonló tulajdonságdefiníciókat tartalmaz. Figyelje meg, hogy a kulcstulajdonságoknak nincs Set metódusa. A kulcstulajdonságok értékei írásvédettek.

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

Emellett a névtelen típusdefiníciók paraméter nélküli konstruktort is tartalmaznak. A paramétereket igénylő konstruktorok nem engedélyezettek.

Ha egy névtelen típusdeklaráció legalább egy kulcstulajdonságot tartalmaz, a típusdefiníció felülbírálja a következő három tagot Object: Equals, GetHashCodeés ToString. Ha nincs kulcstulajdonság deklarálva, csak ToString felül lesz bírálva. A felülírások a következő funkciókat biztosítják:

  • Equals akkor ad True vissza, ha két névtelen típusú példány azonos, vagy ha megfelelnek a következő feltételeknek:

    • Ugyanazzal a tulajdonsággal rendelkeznek.

    • A tulajdonságok deklarálása ugyanabban a sorrendben történik, ugyanazokkal a névvel és ugyanazokkal a kikövetkeztetett típusokkal. A név-összehasonlítások nem megkülönböztetik a kis- és nagybetűket.

    • A tulajdonságok közül legalább az egyik kulcstulajdonság, és a Key kulcsszó ugyanazon tulajdonságokra lesz alkalmazva.

    • Az egyes megfelelő kulcstulajdonság-párok összehasonlítása True eredményez.

      Az alábbi példákban a Equals csak a True és employee01 esetén ad vissza employee08 értéket. Az egyes sorok előtt található megjegyzés megadja, hogy miért nem egyezik meg az új példány a(z) employee01-val.

      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 egy megfelelően egyedi GetHashCode-algoritmust biztosít. Az algoritmus csak a kulcstulajdonságokat használja a kivonatkód kiszámításához.

  • ToString összefűzött tulajdonságértékeket tartalmazó sztringet ad vissza az alábbi példában látható módon. A kulcs- és a nem kulcstulajdonságok is szerepelnek benne.

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

A névtelen típusú explicit névvel ellátott tulajdonságok nem ütköznek ezekkel a létrehozott metódusokkal. Vagyis nem használhat .Equals, .GetHashCodeés .ToString nem nevezhet el tulajdonságot.

A legalább egy kulcstulajdonságot tartalmazó névtelen típusdefiníciók az interfészt System.IEquatable<T> is implementálják, ahol T a névtelen típus típusa.

Megjegyzés:

A névtelen típusdeklarációk csak akkor hozzák létre ugyanazt a névtelen típust, ha ugyanabban a szerelvényben fordulnak elő, a tulajdonságok neve és a kikövetkeztetett típusok azonosak, a tulajdonságok ugyanabban a sorrendben vannak deklarálva, és ugyanazok a tulajdonságok kulcstulajdonságokként vannak megjelölve.

Lásd még