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


Objektum-inicializálók: Névvel ellátott és névtelen típusok (Visual Basic)

Az objektum-inicializálók lehetővé teszik egy összetett objektum tulajdonságainak megadását egyetlen kifejezés használatával. Ezek a névvel ellátott és névtelen típusú példányok létrehozására használhatók.

Deklarációk

A névvel ellátott és névtelen típusú példányok deklarációi szinte azonosak lehetnek, de hatásuk nem azonos. Minden kategória rendelkezik saját képességekkel és korlátozásokkal. Az alábbi példa egy elnevezett osztály Customerpéldányának deklarálásának és inicializálásának kényelmes módját mutatja be egy objektum-inicializáló lista használatával. Figyelje meg, hogy az osztály neve a kulcsszó Newután van megadva.

Dim namedCust = New Customer With {.Name = "Terry Adams"}

A névtelen típusnak nincs használható neve. Ezért a névtelen típusú példányok nem tartalmazhatnak osztálynevet.

Dim anonymousCust = New With {.Name = "Hugo Garcia"}

A két nyilatkozat követelményei és eredményei nem azonosak. Customer A namedCusttulajdonságot tartalmazó Name osztálynak már léteznie kell, és a deklaráció létrehozza az osztály egy példányát. A anonymousCustfordító egy új osztályt határoz meg, amely egy tulajdonságot, egy sztringet hív meg Name, és létrehoz egy új példányt az osztályból.

Névvel ellátott típusok

Az objektum-inicializálók egyszerű módot kínálnak egy típus konstruktorának meghívására, majd egy utasításban megadhatja néhány vagy az összes tulajdonság értékeit. A fordító meghívja a megfelelő konstruktort az utasításhoz: a paraméter nélküli konstruktort, ha nem jelenik meg argumentum, vagy paraméteres konstruktort, ha egy vagy több argumentumot küld. Ezután a megadott tulajdonságok inicializálása abban a sorrendben lesz, amelyben az inicializáló listában megjelennek.

Az inicializálók listájának minden inicializálása egy kezdeti értéknek az osztály egy tagjára való hozzárendeléséből áll. A tagok neve és adattípusai az osztály meghatározásakor lesznek meghatározva. Az alábbi példákban az Customer osztálynak léteznie kell, és el kell neveznie Name a tagokat, és City el kell fogadnia a sztringértékeket.

Dim cust0 As Customer = New Customer With {.Name = "Toni Poe", 
                                           .City = "Louisville"}

Másik lehetőségként ugyanezt az eredményt az alábbi kóddal szerezheti be:

Dim cust1 As New Customer With {.Name = "Toni Poe", 
                                .City = "Louisville"}

Ezek a deklarációk egyenértékűek az alábbi példával, amely egy Customer objektumot hoz létre a paraméter nélküli konstruktor használatával, majd egy utasítással With adja meg a kezdeti értékeket és City tulajdonságokatName.

Dim cust2 As New Customer()
With cust2
    .Name = "Toni Poe"
    .City = "Louisville"
End With

Ha az Customer osztály tartalmaz egy paraméteres konstruktort, amely lehetővé teszi például egy érték Nameküldését, deklarálhat és inicializálhat egy Customer objektumot a következő módokon:

Dim cust3 As Customer = 
    New Customer("Toni Poe") With {.City = "Louisville"}
' --or--
Dim cust4 As New Customer("Toni Poe") With {.City = "Louisville"}

Nem kell inicializálnia az összes tulajdonságot, ahogy az alábbi kód is mutatja.

Dim cust5 As Customer = New Customer With {.Name = "Toni Poe"}

Az inicializálási lista azonban nem lehet üres. A nem inicializált tulajdonságok megőrzik az alapértelmezett értékeket.

Típuskövetkeztetés nevesített típusok használatával

Az objektum-inicializálók és a helyi típusú következtetés kombinálásával lerövidítheti a deklaráció cust1 kódját. Így kihagyhatja a As változó deklarációjában szereplő záradékot. A változó adattípusa a hozzárendelés által létrehozott objektum típusából következik. Az alábbi példában a típus cust6 a következő Customer.

Dim cust6 = New Customer With {.Name = "Toni Poe", 
                               .City = "Louisville"}

Megjegyzések a névvel ellátott típusokról

  • Az osztálytagok csak egyszer inicializálhatók az objektum-inicializálók listájában. A deklaráció cust7 hibát okoz.

    '' This code does not compile because Name is initialized twice.
    ' Dim cust7 = New Customer With {.Name = "Toni Poe", 
    '                                .City = "Louisville",
    '                                .Name = "Blue Yonder Airlines"}
    
  • Egy tag inicializálhatja önmagát vagy egy másik mezőt. Ha egy tag az inicializálás előtt érhető el, az alábbi deklarációhoz cust8hasonlóan az alapértelmezett érték lesz használva. Ne feledje, hogy amikor egy objektum inicializálót használó deklarációt dolgoz fel, az első dolog, ami történik, hogy a megfelelő konstruktort hívja meg. Ezután a program inicializálja az inicializálási lista egyes mezőit. Az alábbi példákban a program az alapértelmezett értéket Name rendeli hozzácust8, és egy inicializált értéket rendel hozzá a program.cust9

    Dim cust8 = New Customer With {.Name = .Name & ", President"}
    Dim cust9 = New Customer With {.Name = "Toni Poe", 
                                   .Title = .Name & ", President"}
    

    Az alábbi példa a paraméteres konstruktort cust3 használja a deklaráláshoz és cust4 inicializáláshoz cust10 és cust11a .

    Dim cust10 = New Customer("Toni Poe") With {.Name = .Name & ", President"}
    ' --or--
    Dim cust11 As New Customer("Toni Poe") With {.Name = .Name & ", President"}
    
  • Az objektum inicializálói beágyazhatók. Az alábbi példában egy olyan osztály látható, AddressClass amely két tulajdonsággal rendelkezik, City és Stateaz Customer osztály egy olyan tulajdonsággal rendelkezik Address , amely a példánya AddressClass.

    Dim cust12 = 
        New Customer With {.Name = "Toni Poe", 
                           .Address = 
                               New AddressClass With {.City = "Louisville", 
                                                      .State = "Kentucky"}}
    Console.WriteLine(cust12.Address.State)
    
  • Az inicializálási lista nem lehet üres.

  • Az inicializálandó példány nem lehet objektum típusú.

  • Az inicializálandó osztálytagok nem lehetnek megosztott tagok, írásvédett tagok, állandók vagy metódushívások.

  • Az inicializálandó osztálytagok nem indexelhetők és nem minősíthetők. Az alábbi példák fordítási hibákat vetnek fel:

    '' Not valid.

    ' Dim c1 = New Customer With {.OrderNumbers(0) = 148662}

    ' Dim c2 = New Customer with {.Address.City = "Springfield"}

Névtelen típusok

A névtelen típusok objektum-inicializálókkal olyan új típusok példányait hozzák létre, amelyeket nem definiál explicit módon és nem nevez el. Ehelyett a fordító létrehoz egy típust az objektum-inicializáló listában megadott tulajdonságoknak megfelelően. Mivel a típus neve nincs megadva, névtelen típusnak nevezzük. Hasonlítsa össze például a következő deklarációt a korábbival cust6.

Dim cust13 = New With {.Name = "Toni Poe", 
                       .City = "Louisville"}

Az egyetlen különbség szintaktikailag az, hogy az adattípus után New nincs megadva név. Mi történik azonban egészen más. A fordító egy új névtelen típust határoz meg, amely két tulajdonsággal rendelkezik, Name és Citylétrehoz egy példányt a megadott értékekkel. A típuskövetkeztetés határozza meg a példában sztringek típusait Name és City típusait.

Figyelemfelhívás

A névtelen típus nevét a fordító hozza létre, és fordítástól fordításig változhat. A kód nem használhat és nem támaszkodhat névtelen típus nevére.

Mivel a típus neve nem érhető el, nem használhat záradékot As a deklarálásához cust13. A típust ki kell következtetni. A késői kötés használata nélkül ez a névtelen típusok használatát helyi változókra korlátozza.

A névtelen típusok kritikus támogatást nyújtanak a LINQ-lekérdezésekhez. A névtelen típusok lekérdezésekben való használatáról további információt a Névtelen típusok és a LINQ bemutatása a Visual Basicben című témakörben talál.

Megjegyzések a névtelen típusokról

  • A névtelen típusdeklarációk összes vagy legtöbb tulajdonsága általában kulcstulajdonságok lesznek, amelyeket a kulcsszónak Key a tulajdonság neve elé való beírásával jeleznek.

    
    Dim anonymousCust1 = New With {Key .Name = "Hugo Garcia", 
                                   Key .City = "Louisville"}
    

    A kulcstulajdonságokról további információt a Kulcs című témakörben talál.

  • A névvel ellátott típusokhoz hasonlóan a névtelen típusdefiníciók inicializálólistáinak is deklarálniuk kell legalább egy tulajdonságot.

    Dim anonymousCust = New With {.Name = "Hugo Garcia"}
    
  • Névtelen típusú példány deklarálásakor a fordító létrehoz egy megfelelő névtelen típusdefiníciót. A tulajdonságok nevei és adattípusai a példánydeklarációból származnak, és a fordító a definícióban szerepel. A tulajdonságok neve és definiálása nem előre van meghatározva, mivel egy névvel ellátott típushoz tartoznak. A típusukra következtetünk. Záradék használatával nem adhatja meg a tulajdonságok adattípusait As .

  • A névtelen típusok a tulajdonságaik nevét és értékeit számos más módon is meghatározhatják. A névtelen típustulajdonságok például egy változó nevét és értékét, illetve egy másik objektum tulajdonságának nevét és értékét is figyelembe vehetik.

    ' Create a variable, Name, and give it an initial value.
    Dim Name = "Hugo Garcia"
    
    ' Variable anonymousCust2 will have one property, Name, with 
    ' "Hugo Garcia" as its initial value.
    Dim anonymousCust2 = New With {Key Name}
    
    ' The next declaration uses a property from namedCust, defined
    ' in an earlier example. After the declaration, anonymousCust3 will
    ' have one property, Name, with "Terry Adams" as its value.
    Dim anonymousCust3 = New With {Key namedCust.Name}
    

    A névtelen típusok tulajdonságainak meghatározására szolgáló beállításokkal kapcsolatos további információkért lásd : Tulajdonságnevek és -típusok következtetése névtelen típusdeklarációkban.

Lásd még