Anonymní typy

Anonymní typy poskytují pohodlný způsob, jak zapouzdřit sadu vlastností jen pro čtení do jednoho objektu bez nutnosti explicitně definovat typ jako první. Název typu je generován kompilátorem a není k dispozici na úrovni zdrojového kódu. Typ každé vlastnosti je odvozen kompilátorem.

Anonymní typy lze vytvořit pomocí new operátoru spolu s inicializátorem objektu. Další informace o inicializátorech objektů naleznete v tématu Inicializátory objektů a kolekcí.

Následující příklad ukazuje anonymní typ, který je inicializován pomocí dvou vlastností 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 obvykle jsou používány v select klauzuli výrazu dotazu pro vrácení podmnožiny vlastností z každého objektu ve zdrojové sekvenci. Další informace o dotazech naleznete v tématu LINQ v jazyce C#.

Anonymní typy obsahují jednu nebo více veřejných vlastností jen pro čtení. Žádné jiné druhy členů třídy, jako jsou metody nebo události, jsou platné. Výraz použitý k inicializaci vlastnosti nemůže být null , anonymní funkce nebo typu ukazatele.

Nejběžnějším scénářem je inicializace anonymního typu s vlastnostmi z jiného typu. V následujícím příkladu Předpokládejme, že existuje třída s názvem Product . Třída Product zahrnuje Color a Price vlastnosti spolu s dalšími vlastnostmi, které vás zajímají. Proměnná products je kolekcí Product objektů. Deklarace anonymního typu začíná new klíčovým slovem. Deklarace inicializuje nový typ, který používá pouze dvě vlastnosti Product . Použití anonymních typů způsobí, že se v dotazu vrátí menší množství dat.

Pokud v anonymním typu nezadáte názvy členů, kompilátor poskytne členům anonymního typu stejný název jako vlastnost, která je použita k jejich inicializaci. Zadejte název vlastnosti, která je inicializována výrazem, jak je znázorněno v předchozím příkladu. V následujícím příkladu jsou názvy vlastností anonymního typu 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 při použití anonymního typu k inicializaci proměnné, deklarujete proměnnou jako implicitně typovou místní proměnnou pomocí var. V deklaraci proměnné nelze zadat název typu, protože k podkladovému názvu anonymního typu má přístup pouze kompilátor. Další informace o naleznete var v tématu implicitně typované lokální proměnné.

Pole anonymně typovaného prvku lze vytvořit kombinací implicitní typové místní proměnné a implicitně typovaného 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 }};

Anonymní typy jsou class typy, které jsou odvozeny přímo z object a které nelze přetypovat na žádný typ s výjimkou object . Kompilátor poskytuje název pro každý anonymní typ, přestože aplikace k němu nemá přístup. Z perspektivy modulu CLR (Common Language Runtime) se anonymní typ neliší od žádného jiného typu odkazu.

Pokud dva nebo více inicializátorů anonymních objektů v sestavení určují sekvenci vlastností, které jsou ve stejném pořadí a mají stejné názvy a typy, kompilátor považuje objekty za instance stejného typu. Sdílejí stejné informace typu vygenerované kompilátorem.

Anonymní typy podporují non-destruktivní mutace ve formě s výrazy. To umožňuje vytvořit novou instanci anonymního typu, kde jedna nebo více vlastností má nové hodnoty:

var apple = new { Item = "apples", Price = 1.35 };
var onSale = apple with { Price = 0.79 };
Console.WriteLine(apple);
Console.WriteLine(onSale);

Nemůžete deklarovat pole, vlastnost, událost ani návratový typ metody jako anonymní typ. Podobně nelze deklarovat formální parametr metody, vlastnosti, konstruktoru nebo indexeru jako typ, který je typu anonymní. Pro předání anonymního typu nebo kolekce, která obsahuje anonymní typy jako argument metody, lze parametr deklarovat jako typ object . Použití object anonymních typů však popírá účel silného psaní. Pokud je nutné uložit výsledky dotazu nebo je předat mimo hranice metody, zvažte použití obyčejné pojmenované struktury nebo třídy namísto anonymního typu.

Vzhledem k Equals tomu GetHashCode , že metody a na anonymních typech jsou definovány s ohledem na Equals GetHashCode metody a vlastností, jsou dvě instance stejného anonymního typu stejné pouze v případě, že jsou všechny jejich vlastnosti stejné.