Typy anonimowe (Przewodnik programowania w języku C#)Anonymous Types (C# Programming Guide)

Typy anonimowe zapewniają wygodny sposób hermetyzowania zestawu właściwości tylko do odczytu w jednym obiekcie bez konieczności jawnego definiowania typu.Anonymous types provide a convenient way to encapsulate a set of read-only properties into a single object without having to explicitly define a type first. Nazwa typu jest generowana przez kompilator i nie jest dostępna na poziomie kodu źródłowego.The type name is generated by the compiler and is not available at the source code level. Typ każdej właściwości jest wnioskowany przez kompilator.The type of each property is inferred by the compiler.

Typy anonimowe można tworzyć za pomocą operatora New wraz z inicjatorem obiektu.You create anonymous types by using the new operator together with an object initializer. Aby uzyskać więcej informacji na temat inicjatorów obiektów, zobacz Inicjatory obiektów i kolekcji.For more information about object initializers, see Object and Collection Initializers.

Poniższy przykład przedstawia typ anonimowy, który jest inicjowany z dwiema właściwościami o nazwie Amount i Message.The following example shows an anonymous type that is initialized with two properties named Amount and 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);  

Typy anonimowe są zwykle używane w klauzuli SELECT wyrażenia zapytania w celu zwrócenia podzestawu właściwości z każdego obiektu w sekwencji źródłowej.Anonymous types typically are used in the select clause of a query expression to return a subset of the properties from each object in the source sequence. Aby uzyskać więcej informacji o zapytaniach, zobacz LINQ in C# .For more information about queries, see LINQ in C#.

Typy anonimowe zawierają co najmniej jedną publiczną właściwość tylko do odczytu.Anonymous types contain one or more public read-only properties. Żadne inne rodzaje elementów członkowskich klasy, takie jak metody lub zdarzenia, są prawidłowe.No other kinds of class members, such as methods or events, are valid. Wyrażenia, które jest używane do inicjowania właściwości, nie można null, funkcji anonimowej ani typu wskaźnika.The expression that is used to initialize a property cannot be null, an anonymous function, or a pointer type.

Najbardziej typowym scenariuszem jest zainicjowanie typu anonimowego z właściwościami innego typu.The most common scenario is to initialize an anonymous type with properties from another type. W poniższym przykładzie Załóżmy, że Klasa istnieje o nazwie Product.In the following example, assume that a class exists that is named Product. Klasa Product obejmuje właściwości Color i Price, a także inne właściwości, które nie są zainteresowane.Class Product includes Color and Price properties, together with other properties that you are not interested in. Zmienna products jest kolekcją obiektów Product.Variable products is a collection of Product objects. Deklaracja typu anonimowego rozpoczyna się od słowa kluczowego new.The anonymous type declaration starts with the new keyword. Deklaracja inicjuje nowy typ, który używa tylko dwóch właściwości z Product.The declaration initializes a new type that uses only two properties from Product. Powoduje to zwrócenie mniejszej ilości danych w zapytaniu.This causes a smaller amount of data to be returned in the query.

Jeśli nie określisz nazw składowych w typie anonimowym, kompilator poda elementy członkowskie typu anonimowego o tej samej nazwie, co właściwość używana do ich zainicjowania.If you do not specify member names in the anonymous type, the compiler gives the anonymous type members the same name as the property being used to initialize them. Należy podać nazwę właściwości, która jest inicjowana za pomocą wyrażenia, jak pokazano w poprzednim przykładzie.You must provide a name for a property that is being initialized with an expression, as shown in the previous example. W poniższym przykładzie nazwy właściwości typu anonimowego są Color i Price.In the following example, the names of the properties of the anonymous type are Color and 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);
}

Typowo, jeśli używasz typu anonimowego do inicjowania zmiennej, deklarujesz zmienną jako niejawnie wpisaną zmienną lokalną przy użyciu var.Typically, when you use an anonymous type to initialize a variable, you declare the variable as an implicitly typed local variable by using var. Nie można określić nazwy typu w deklaracji zmiennej, ponieważ tylko kompilator ma dostęp do podstawowej nazwy typu anonimowego.The type name cannot be specified in the variable declaration because only the compiler has access to the underlying name of the anonymous type. Aby uzyskać więcej informacji na temat var, zobacz niejawnie wpisane zmienne lokalne.For more information about var, see Implicitly Typed Local Variables.

Można utworzyć tablicę elementów o jednoznacznie określonym typie, łącząc niejawnie wpisaną zmienną lokalną i niejawnie wpisaną tablicę, jak pokazano w poniższym przykładzie.You can create an array of anonymously typed elements by combining an implicitly typed local variable and an implicitly typed array, as shown in the following example.

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

UwagiRemarks

Typy anonimowe to typy klas , które są wyprowadzane bezpośrednio z obiektui nie mogą być rzutowane do żadnego typu poza obiektem.Anonymous types are class types that derive directly from object, and that cannot be cast to any type except object. Kompilator zawiera nazwę dla każdego typu anonimowego, chociaż aplikacja nie może uzyskać do niej dostępu.The compiler provides a name for each anonymous type, although your application cannot access it. Z perspektywy środowiska uruchomieniowego języka wspólnego typ anonimowy nie różni się od żadnego innego typu odwołania.From the perspective of the common language runtime, an anonymous type is no different from any other reference type.

Jeśli co najmniej dwa anonimowe Inicjatory obiektów w zestawie określają sekwencję właściwości, które są w tej samej kolejności i mają takie same nazwy i typy, kompilator traktuje obiekty jako wystąpienia tego samego typu.If two or more anonymous object initializers in an assembly specify a sequence of properties that are in the same order and that have the same names and types, the compiler treats the objects as instances of the same type. Korzystają one z tych samych informacji o typie wygenerowanym przez kompilator.They share the same compiler-generated type information.

Nie można zadeklarować pola, właściwości, zdarzenia lub typu zwracanego metody jako typu anonimowego.You cannot declare a field, a property, an event, or the return type of a method as having an anonymous type. Podobnie nie można zadeklarować formalnego parametru metody, właściwości, konstruktora lub indeksatora jako typu anonimowego.Similarly, you cannot declare a formal parameter of a method, property, constructor, or indexer as having an anonymous type. Aby przekazać typ anonimowy lub kolekcję, która zawiera typy anonimowe jako argument metody, można zadeklarować parametr jako obiekt typu.To pass an anonymous type, or a collection that contains anonymous types, as an argument to a method, you can declare the parameter as type object. Jednak dzięki temu przeznaczeniem jest silne wpisywanie.However, doing this defeats the purpose of strong typing. Jeśli musisz przechowywać wyniki zapytania lub przekazać je poza granicą metody, rozważ użycie zwykłej nazwanej struktury lub klasy zamiast typu anonimowego.If you must store query results or pass them outside the method boundary, consider using an ordinary named struct or class instead of an anonymous type.

Ponieważ metody Equals i GetHashCode na typach anonimowych są zdefiniowane w kategoriach Equals i GetHashCode metod właściwości, dwa wystąpienia tego samego typu anonimowego są równe tylko wtedy, gdy wszystkie ich właściwości są równe.Because the Equals and GetHashCode methods on anonymous types are defined in terms of the Equals and GetHashCode methods of the properties, two instances of the same anonymous type are equal only if all their properties are equal.

Zobacz takżeSee also