Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
CSharp_Prog_Guide.doc
Скачиваний:
18
Добавлен:
16.11.2019
Размер:
6.22 Mб
Скачать

Заметки

Анонимные типы являются ссылочными типами, которые происходят непосредственно от объекта. Компилятор присваивает им имена, несмотря на то что они недоступны для вашего приложения. С точки зрения среды CLR анонимный тип ничем не отличается от любого другого ссылочного типа.

Если два или более анонимных типа имеют одинаковые номера и типы свойств одного порядка, компилятор обрабатывает их как один и тот же тип, в результате чего им присваивается одна и та же информация о типе, созданная компилятором.

Анонимный тип имеет область действия метода. Для передачи анонимного типа или коллекции анонимных типов за границы метода необходимо прежде всего привести тип к объекту. Однако это нарушает строгое определение анонимного типа. Если результаты запроса нужно сохранить или передать за границы метода, попробуйте воспользоваться обычной именованной структурой или классом вместо анонимного типа.

Анонимные типы не могут содержать небезопасные типы в качестве свойств.

Поскольку методы Equals и GetHashCode анонимных типов определены через Equals и GetHashcode свойств, два экземпляра одного анонимного типа будут идентичны только тогда, когда идентичны все их свойства.

How to: Return Subsets of Element Properties in a Query

Use an anonymous type in a query expression when both of these conditions apply:

  • You want to return only some of the properties of each source element.

  • You do not have to store the query results outside the scope of the method in which the query is executed.

If you only want to return one property or field from each source element, then you can just use the dot operator in the select clause. For example, to return only the ID of each student, write the select clause as follows:

select student.ID;

Example

The following example shows how to use an anonymous type to return only a subset of the properties of each source element that matches the specified condition.

private static void QueryByScore()

{

// Create the query. var is required because

// the query produces a sequence of anonymous types.

var queryHighScores =

from student in students

where student.ExamScores[0] > 95

select new { student.FirstName, student.LastName };

// Execute the query.

foreach (var obj in queryHighScores)

{

// The anonymous type's properties were not named. Therefore

// they have the same names as the Student properties.

Console.WriteLine(obj.FirstName + ", " + obj.LastName);

}

}

/* Output:

Adams, Terry

Fakhouri, Fadi

Garcia, Cesar

Omelchenko, Svetlana

Zabokritski, Eugene

*/

Возвращение поднаборов свойств элементов в запросе

Используйте анонимный тип в выражении запроса, если выполняются оба этих условия:

  • Требуется возвратить только некоторые свойства каждого из исходных элементов.

  • Не требуется сохранять результаты запроса за пределами области действия метода, в котором был выполнен запрос.

Если требуется возвратить одно свойство или поле из каждого исходного элемента, можно просто воспользоваться оператором "точка" в предложении select. Например, чтобы возвратить только ID для каждого student, создайте следующее предложение select:

select student.ID;

Пример

В следующем примере показывается, как использовать анонимный тип для возврата только поднабора свойств каждого из исходных элементов, соответствующих указанному условию.

----

Note that the anonymous type uses the source element's names for its properties if no names are specified. To give new names to the properties in the anonymous type, write the select statement as follows:

select new { First = student.FirstName, Last = student.LastName };

If you try this in the previous example, then the Console.WriteLine statement must also change:

Console.WriteLine(student.First + " " + student.Last);

Compiling the Code

  • To run this code, copy and paste the class into a Visual C# console application project that has been created in Visual Studio. By default, this project targets version 3.5 of the .NET Framework, and it will have a reference to System.Core.dll and a using directive for System.Linq. If one or more of these requirements are missing from the project, you can add them manually.

Обратите внимание, что анонимный тип использует имена исходного элемента для его свойств, если имена не заданы. Чтобы назначить свойствам в анонимном типе новые имена, укажите следующий оператор select:

select new { First = student.FirstName, Last = student.LastName };

Если попытаться вставить его в предыдущий пример, то потребуется изменить и оператор Console.WriteLine:

Console.WriteLine(student.First + " " + student.Last);