Sdílet prostřednictvím


Inicializátory objektů: pojmenované a anonymní typy (Visual Basic)

Inicializátory objektů umožňují zadat vlastnosti komplexního objektu pomocí jednoho výrazu. Lze je použít k vytvoření instancí pojmenovaných typů a anonymních typů.

Deklarace

Deklarace instancí pojmenovaných a anonymních typů můžou vypadat téměř stejně, ale jejich účinky nejsou stejné. Každá kategorie má vlastní schopnosti a omezení. Následující příklad ukazuje pohodlný způsob, jak deklarovat a inicializovat instanci pojmenované třídy pomocí Customerseznamu inicializátoru objektů. Všimněte si, že název třídy je zadán za klíčovým slovem New.

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

Anonymní typ nemá použitelný název. Proto instance anonymního typu nemůže obsahovat název třídy.

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

Požadavky a výsledky těchto dvou deklarací nejsou stejné. V namedCustpřípadě třídy, Customer která má Name vlastnost již existovat, a deklarace vytvoří instanci této třídy. Kompilátor anonymousCustdefinuje novou třídu, která má jednu vlastnost, řetězec volaný Namea vytvoří novou instanci této třídy.

Pojmenované typy

Inicializátory objektů poskytují jednoduchý způsob, jak volat konstruktor typu a pak nastavit hodnoty některých nebo všech vlastností v jednom příkazu. Kompilátor vyvolá příslušný konstruktor pro příkaz: konstruktor bez parametrů, pokud nejsou prezentovány žádné argumenty, nebo parametrizovaný konstruktor, pokud je odeslán jeden nebo více argumentů. Potom se zadané vlastnosti inicializují v pořadí, ve kterém jsou uvedeny v seznamu inicializátorů.

Každá inicializace v seznamu inicializátorů se skládá z přiřazení počáteční hodnoty k členu třídy. Názvy a datové typy členů jsou určeny při definování třídy. V následujících příkladech Customer musí existovat třída a musí mít pojmenované Name členy a City které mohou přijímat řetězcové hodnoty.

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

Stejný výsledek můžete získat také pomocí následujícího kódu:

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

Každá z těchto deklarací je ekvivalentní následujícímu příkladu, který vytvoří Customer objekt pomocí konstruktoru bez parametrů a potom určuje počáteční hodnoty pro vlastnosti NameCity pomocí With příkazu.

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

Customer Pokud třída obsahuje parametrizovaný konstruktor, který umožňuje odeslat hodnotu pro Name, například můžete deklarovat a inicializovat Customer objekt následujícími způsoby:

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

Nemusíte inicializovat všechny vlastnosti, jak ukazuje následující kód.

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

Inicializační seznam však nemůže být prázdný. Neinicializované vlastnosti si zachovají výchozí hodnoty.

Odvození typů s pojmenovanými typy

Kód deklarace cust1 můžete zkrátit kombinováním inicializátorů objektů a odvození místního typu. To vám umožní vynechat As klauzuli v deklaraci proměnné. Datový typ proměnné je odvozen z typu objektu, který je vytvořen přiřazením. V následujícím příkladu je typ cust6 .Customer

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

Poznámky o pojmenovaných typech

  • Člen třídy nelze inicializovat více než jednou v seznamu inicializátoru objektů. cust7 Deklarace příčin chyby.

    '' This code does not compile because Name is initialized twice.
    ' Dim cust7 = New Customer With {.Name = "Toni Poe", 
    '                                .City = "Louisville",
    '                                .Name = "Blue Yonder Airlines"}
    
  • Člen lze použít k inicializaci sebe sama nebo jiného pole. Pokud je člen přístupný před inicializován, jako v následující deklaraci pro cust8, bude použita výchozí hodnota. Mějte na paměti, že při zpracování deklarace, která používá inicializátor objektu, první věc, která se stane, je vyvolán příslušný konstruktor. Potom se inicializují jednotlivá pole v seznamu inicializátorů. V následujících příkladech je výchozí hodnota pro Namecust8přiřazena a inicializovaná hodnota je přiřazena v cust9.

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

    Následující příklad používá parametrizovaný konstruktor z cust3 a cust4 deklarovat a inicializovat cust10 a cust11.

    Dim cust10 = New Customer("Toni Poe") With {.Name = .Name & ", President"}
    ' --or--
    Dim cust11 As New Customer("Toni Poe") With {.Name = .Name & ", President"}
    
  • Inicializátory objektů lze vnořit. V následujícím příkladu je třída, AddressClass která má dvě vlastnosti, City a Statetřída CustomerAddress vlastnost, která je instance AddressClass.

    Dim cust12 = 
        New Customer With {.Name = "Toni Poe", 
                           .Address = 
                               New AddressClass With {.City = "Louisville", 
                                                      .State = "Kentucky"}}
    Console.WriteLine(cust12.Address.State)
    
  • Seznam inicializace nemůže být prázdný.

  • Inicializovaná instance nemůže být typu Object.

  • Členy třídy, které se inicializují, nemohou být sdílené členy, členy jen pro čtení, konstanty nebo volání metody.

  • Členy třídy, které se inicializují, nelze indexovat ani kvalifikovat. Následující příklady vyvolávají chyby kompilátoru:

    '' Not valid.

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

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

Anonymní typy

Anonymní typy používají inicializátory objektů k vytvoření instancí nových typů, které explicitně nedefinujete a pojmenujete. Místo toho kompilátor generuje typ podle vlastností, které určíte v seznamu inicializátoru objektů. Protože název typu není zadaný, označuje se jako anonymní typ. Například porovnejte následující deklaraci s předchozí deklarací pro cust6.

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

Jediným rozdílem syntakticky je, že za New datovým typem není zadán žádný název. Co se ale stane, je docela jiné. Kompilátor definuje nový anonymní typ, který má dvě vlastnosti, Name a Cityvytvoří instanci s zadanými hodnotami. Odvození typu určuje typy Name řetězců a City v příkladu, které mají být řetězce.

Upozornění

Název anonymního typu je generován kompilátorem a může se lišit od kompilace po kompilaci. Váš kód by neměl používat nebo spoléhat na název anonymního typu.

Protože název typu není k dispozici, nelze deklarovat Ascust13klauzuli . Jeho typ musí být odvozen. Bez použití pozdní vazby to omezuje použití anonymních typů na místní proměnné.

Anonymní typy poskytují kritickou podporu pro dotazy LINQ. Další informace o použití anonymních typů v dotazech naleznete v tématu Anonymní typy a Úvod do LINQ v jazyce Visual Basic.

Poznámky o anonymních typech

  • Obvykle všechny nebo většina vlastností v deklaraci anonymního typu budou klíčové vlastnosti, které jsou označené zadáním klíčového slova Key před název vlastnosti.

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

    Další informace o vlastnostech klíče naleznete v tématu Klíč.

  • Stejně jako pojmenované typy musí inicializátory pro definice anonymního typu deklarovat alespoň jednu vlastnost.

    Dim anonymousCust = New With {.Name = "Hugo Garcia"}
    
  • Když je deklarována instance anonymního typu, kompilátor vygeneruje odpovídající definici anonymního typu. Názvy a datové typy vlastností jsou převzaty z deklarace instance a jsou zahrnuty kompilátorem v definici. Vlastnosti nejsou pojmenované a definované předem, protože by byly pro pojmenovaný typ. Jejich typy jsou odvozeny. Datové typy vlastností nelze zadat pomocí As klauzule.

  • Anonymní typy mohou také vytvořit názvy a hodnoty jejich vlastností několika dalšími způsoby. Vlastnost anonymního typu může například převzít název i hodnotu proměnné, nebo název a hodnotu vlastnosti jiného objektu.

    ' 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}
    

    Další informace o možnostech definování vlastností v anonymních typech naleznete v tématu Postupy: Odvození názvů a typů vlastností v deklaracích anonymního typu.

Viz také