Udostępnij za pośrednictwem


Typy anonimowe (Podręcznik programowania C#)

Typy anonimowe zapewniają wygodny sposób do hermetyzacji zestawu właściwości tylko do odczytu w jeden obiekt bez konieczności jawnie zdefiniować typ po raz pierwszy.Nazwa typu jest generowany przez kompilator i nie jest dostępna na poziomie kodu źródłowego.Typ każdej właściwości jest wnioskowana przez kompilator.

Tworzenie anonimowych typy przy użyciu Nowy operatora wraz z Inicjator obiektu.Aby uzyskać więcej informacji na temat inicjatory obiektu, zobacz Obiektów i kolekcji inicjatorów (Podręcznik programowania C#).

W poniższym przykładzie Typ anonimowy, który jest inicjowany z dwóch właściwości o nazwie Amount i 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ą zazwyczaj używane w Wybierz klauzuli wyrażenia kwerendy zwraca podzbiór właściwości z każdego obiektu w sekwencji źródłowej.Aby uzyskać więcej informacji dotyczących kwerend, zobacz Wyrażenia w kwerendzie LINQ (Podręcznik programowania C#).

Typy anonimowe zawierają jeden lub więcej publicznych właściwości tylko do odczytu.Nie inne rodzaje elementy klas, takie jak metody lub zdarzenia, są prawidłowe.Wyrażenie, które służy do inicjowania właściwość nie może być null, funkcją anonimową lub typ wskaźnika.

Najbardziej typowym scenariuszem jest zainicjowanie typ anonimowy z właściwościami z innego typu.W poniższym przykładzie przyjęto założenie, że istnieje klasa, która nosi nazwę Product.Klasa Product obejmuje Color i Price właściwości, oraz inne właściwości, które nie są zainteresowani.Zmiennej products jest zbiorem Product obiektów.Deklaracja typu anonimowego rozpoczyna się od new słowa kluczowego.Deklaracja inicjuje nowego typu, w których używane są tylko dwie właściwości z Product.Powoduje to mniejszą ilość danych, które mają być zwrócone w kwerendzie.

Jeśli nie podasz nazwy składników w typ anonimowy, kompilator oferuje członkom typ anonimowy taką samą nazwę jak właściwość używane je zainicjować.Musisz podać nazwę dla właściwości, która jest inicjowany z wyrazem, jak pokazano w poprzednim przykładzie.W poniższym przykładzie, nazwy właściwości typu anonimowego są Color i 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);
}

Zazwyczaj, gdy jest używany typ anonimowy, aby zainicjować zmienną, Deklarujemy zmienną jako niejawnie pismo zmiennej lokalnej za pomocą var..Nie można określić nazwę typu w deklaracji zmiennej, ponieważ tylko kompilator ma dostęp do podstawowych Nazwa typu anonimowego.Więcej informacji o var, zobacz Wpisane niejawnie zmiennych lokalnych (C# Programming Guide).

Można utworzyć tablicy elementów anonimowo maszynowy łącząc niejawnie pismo zmiennej lokalnej i tablicę niejawnie maszynowy, jak pokazano w poniższym przykładzie.

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

Uwagi

Typy anonimowe są klasy typów, które wynikają bezpośrednio z obiektu, i że nie można rzutować na dowolnego typu z wyjątkiem obiektu.Kompilator podaje nazwę dla każdego typu anonimowego, mimo że aplikacji nie można do niego dostęp.Z punktu widzenia aparatu plików wykonywalnych języka wspólnego, typ anonimowy nie różni się od innych typu odwołania.

Jeśli dwa lub więcej inicjatory anonimowego obiektu w zestawie określić kombinację właściwości, które są w tej samej kolejności i mają takie same nazwy i typy, kompilator traktuje obiekty jako wystąpień tego samego typu.Mają one te same informacje typu generowanych przez kompilator.

Nie można zadeklarować pola, właściwość, zdarzenie lub zwrotu typu metody jako mające typ anonimowy.Podobnie nie mogą deklarować parametrów formalnych metody, właściwości, Konstruktor lub indeksator za mające typ anonimowy.Aby przekazać typ anonimowy lub kolekcja, która zawiera typy anonimowe, jako argument do metody, można zadeklarować parametr jako obiekt tekstowy.Jednakże ten sposób pokonuje celem silne wpisywanie.Jeśli musisz przechowywanie wyników kwerendy lub przekazać je poza granicą metody, należy rozważyć użycie zwykłych nazwanego struct lub klasy zamiast typ anonimowy.

Ponieważ Equals i GetHashCode metody na typy anonimowe są definiowane z Equals i GetHashcode metod, właściwości, dwa wystąpienia tego samego typu anonimowego są równe, tylko wtedy, gdy ich właściwości są równe.

Zobacz też

Informacje

Obiektów i kolekcji inicjatorów (Podręcznik programowania C#)

Koncepcje

Podręcznik programowania C#

Wyrażenia w kwerendzie LINQ (Podręcznik programowania C#)

Inne zasoby

Wprowadzenie do programu LINQ w C#