.OrderBy(itemToProcess)
.Select(itemToProcess);
// Вывести результаты.
foreach (var game in subset)
{
Console.WriteLine("Item: {0}", game);
}
Console.WriteLine();
}
// Цели делегатов.
public static bool Filter(string game)
{
return game.Contains(" ");
}
public static string ProcessItem(string game)
{
return game;
}
}
Чтобы протестировать такую версию логики обработки строк, метод QueryStringsWithRawDelegates() понадобится вызвать внутри операторов верхнего уровня в классе Program:
VeryComplexQueryExpression.QueryStringsWithRawDelegates();
Если теперь запустить приложение, чтобы опробовать все возможные подходы, вывод окажется идентичным независимо от выбранного пути. Запомните перечисленные ниже моменты относительно выражений запросов и их внутреннего представления.
• Выражения запросов создаются с применением разнообразных операций запросов С# .
• Операции запросов — это просто сокращенное обозначение для вызова расширяющих методов, определенных в типе System.Linq.Enumerable.
• Многие методы класса Enumerable требуют передачи делегатов (в частности, Func<>) в качестве параметров.
• Любой метод, ожидающий параметра типа делегата, может принимать вместо него лямбда-выражение.
• Лямбда-выражения являются всего лишь замаскированными анонимными методами (и значительно улучшают читабельность).
• Анонимные методы представляют собой сокращенные обозначения для размещения экземпляра низкоуровневого делегата и ручного построения целевого метода делегата.
Хотя здесь мы погрузились в детали чуть глубже, чем возможно хотелось, приведенное обсуждение должно было способствовать пониманию того, что фактически делают "за кулисами" дружественные к пользователю операции запросов С#.
Резюме
LINQ — это набор взаимосвязанных технологий, которые были разработаны для предоставления единого и симметричного стиля взаимодействия с данными несходных форм. Как объяснялось в главе, LINQ может взаимодействовать с любым типом, реализующим интерфейс IEnumerable, в том числе с простыми массивами, а также с обобщенными и необобщенными коллекциями данных.
Было показано, что работа с технологиями LINQ обеспечивается несколькими средствами языка С#. Например, учитывая тот факт, что выражения запросов LINQ могут возвращать любое количество результирующих наборов, для представления лежащего в основе типа данных принято использовать ключевое слово var. Кроме того, для построения функциональных и компактных запросов LINQ могут применяться лямбда-выражения, синтаксис инициализации объектов и анонимные типы.
Более важно то, что операции запросов LINQ в C# на самом деле являются просто сокращенными обозначениями для обращения к статическим членам типа System.Linq.Enumerable. Вы узнали, что большинство членов класса Enumerable оперируют с типами делегатов Func и для выполнения запроса могут принимать на входе адреса существующих методов, анонимные методы или лямбда-выражения.
Глава 14
Процессы, домены приложении и контексты загрузки
В настоящей главе будут представлены детали обслуживания сборки исполняющей средой, а также отношения между процессами, доменами приложений и контекстами загрузки.
Выражаясь кратко,
Хотя вполне справедливо утверждать, что многие повседневные задачи программирования не предусматривают работу с процессами, доменами приложений или контекстами загрузки напрямую, их понимание важно при взаимодействии с многочисленными API-интерфейсами .NET Core, включая многопоточную и параллельную обработку, а также сериализацию объектов.
Роль процесса Windows