Sdílet prostřednictvím


Anonymní typy (Průvodce programováním v C#)

Anonymní typy poskytují pohodlný způsob, jak zapouzdřit sadu vlastností jen pro čtení do jednoho objektu, aniž by bylo nutné explicitně definovat typ nejprve.Název typu je generován kompilátor a není k dispozici na úrovni zdrojového kódu.Typ jednotlivých vlastností je odvozen překladačem.

Můžete vytvářet anonymní typy pomocí nové operátor společně inicializátoru objektu.Další informace o objektu inicializátory, naleznete v části Inicializátory objektu a kolekce (Průvodce programováním v C#).

Následující příklad ukazuje anonymní typ, který je inicializován s dvě vlastnosti s názvem Amount a Message.

var v = new { Amount = 108, Message = "Hello" };

// Rest the mouse pointer over v.Amount and v.Message in the following
// statement to verify that their inferred types are int and string.
Console.WriteLine(v.Amount + v.Message);

Anonymní typy jsou obvykle používaných v vyberte klauzule výrazu dotazu, který má být vrácen podmnožinu vlastnosti každého objektu ve zdrojové sekvence.Další informace o dotazech naleznete v tématu LINQ – výrazy dotazů (Průvodce programováním v C#).

Anonymní typy obsahovat jeden nebo více veřejné jen pro čtení vlastnosti.Žádné jiné druhy členy třídy, jako jsou metody nebo události, nejsou platné.Výraz, který slouží k inicializaci vlastnosti nesmí být null, anonymní funkce nebo ukazatele typu.

Nejběžnější scénář je inicializovat instanci anonymního typu s vlastnostmi z jiného typu.V následujícím příkladu předpokládat, že třída existuje s názvem Product.Třída Product zahrnuje Color a Price vlastností, jakož i další vlastnosti, které si nejste zájem.Proměnné products je kolekce Product objekty.Anonymní typ deklarace začíná new klíčové slovo.Prohlášení inicializuje nový typ, který se používá pouze dvě vlastnosti z Product.To způsobí, že menší množství data, která mají být vráceny v dotazu.

Pokud nezadáte názvy členů v anonymní typ, kompilátor poskytuje členům anonymní typ stejný název jako vlastnost používaný k inicializaci.Název vlastnosti, která je během inicializace s výrazem, je nutné zadat, jak je znázorněno v předchozím příkladu.V následujícím příkladu jsou názvy vlastností anonymní typ Color a Price.

var productQuery = 
    from prod in products
    select new { prod.Color, prod.Price };

foreach (var v in productQuery)
{
    Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price);
}

Obvykle, když použijete anonymní typ k inicializaci proměnné, deklarujete proměnnou jako implicitně zadaný místní proměnné pomocí var.Název typu nelze zadat v deklarace proměnné, protože pouze kompilátor má přístup k základní název typu anonymní.Další informace o objektu var získáte v tématu Implicitně typované lokální proměnné (Průvodce programováním v C#).

Můžete vytvořit pole anonymně zadaný elementů kombinováním implicitně zadaný místní proměnné a implicitně zadané pole, jak je znázorněno v následujícím příkladu.

var anonArray = new[] { new { name = "apple", diam = 4 }, new { name = "grape", diam = 1 }};

Poznámky

Anonymní typy jsou třídy typy, které jsou odvozeny přímo z objektu, a který nelze přetypovat na libovolný typ kromě objektu.Kompilátor poskytuje název pro každý anonymní typ, přestože aplikace nemohl získat přístup.Z hlediska common language runtime je anonymní typ ne liší od jiných typ odkazu.

Pokud dvě nebo více inicializátory anonymní objekt v sestavení zadat posloupnost vlastnosti, které jsou ve stejném pořadí nebo které mají stejné názvy a typy, kompilátor považuje za objekty instance stejného typu.Sdílejí stejné informace generované kompilátoru typu.

Nemůžete deklarovat pole, vlastnost, událost nebo návratový typ metody jako s anonymní typ.Podobně nemohou deklarovat formální parametr metody, vlastnosti, konstruktor nebo indexer jako s anonymní typ.Předat anonymní typ nebo kolekci, která obsahuje anonymní typy jako argument pro metodu, je možné deklarovat parametr jako objekt typu.Tím však účinně chrání před účel silné zadáním příkazu.Pokud je nutné ukládat výsledky dotazu nebo předat je mimo hranice metodu, zvažte použití třídy nebo běžným pojmenované struktury namísto anonymní typ.

Vzhledem k tomu Equals a GetHashCode metody na anonymní typy jsou definovány z hlediska Equals a GetHashCode metody vlastnosti, dvě instance stejného typu anonymní jsou stejné pouze v případě, že všechny své vlastnosti jsou stejné.

Viz také

Referenční dokumentace

Inicializátory objektu a kolekce (Průvodce programováním v C#)

Koncepty

Průvodce programováním v C#

LINQ – výrazy dotazů (Průvodce programováním v C#)

Další zdroje

Začínáme s dotazy LINQ v jazyce C#