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í Customer
seznamu 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 namedCust
případě třídy, Customer
která má Name
vlastnost již existovat, a deklarace vytvoří instanci této třídy. Kompilátor anonymousCust
definuje novou třídu, která má jednu vlastnost, řetězec volaný Name
a 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 Name
City
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 proName
cust8
přiřazena a inicializovaná hodnota je přiřazena vcust9
.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
acust4
deklarovat a inicializovatcust10
acust11
.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
aState
třídaCustomer
máAddress
vlastnost, která je instanceAddressClass
.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 City
vytvoří 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 As
cust13
klauzuli . 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.