CLR via C#. Программирование на платформе Microsoft .NET Framework 4.5 на языке C#, 4-е издание

CLR via C#. Программирование на платформе Microsoft .NET Framework 4.5 на языке C#, 4-е издание
Автор: Рихтер Джеффри
Год: 2013
ISBN: 978-5-496-00433-6
Страниц: 896
Язык: Русский
Формат: PDF
Размер: 10 Мб

Download

Эта книга, выходящая в четвертом издании и уже ставшая классическим учебником по программированию, подробно описывает внутреннее устройство и функционирование общеязыковой исполняющей среды (CLR) Microsoft .NET Framework версии 4.5. Написанная признанным экспертом в области программирования Джеффри Рихтером, много лет являющимся консультантом команды разработчиков .NET Framework компании Microsoft, книга научит вас создавать по-настоящему надежные приложения любого вида, в том числе с использованием Microsoft Silverlight, ASP.NET, Windows Presentation Foundation и т. д.
Четвертое издание полностью обновлено в соответствии со спецификацией платформы .NET Framework 4.5, а также среды Visual Studio 2012 и C# 5.0.

+


В C# возможны преобразования между экземплярами совместимых типов. Преоб­разование всегда создает новое значение из существующего. Преобразования могут быть либо неявными, либо явными: неявные преобразования происходят автомати­чески, а явные преобразования требуют приведения.В следующем примере мы неявно преобразуем in t в тип long (который имеет в два раза больше битов, чем in t) и явно

Неявные преобразования разрешены в случае удовлетворения таких условий:

  • компилятор может гарантировать, что они всегда проходят успешно;
  • в результате преобразования никакая информация не теряется.

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

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

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

Ссылочные типы требуют раздельного выделения памяти для ссылки и объекта. Объект потребляет столько памяти, сколько необходимо его полям, плюс дополни­тельный объем на административные нужды. Точный объем накладных расходов, в сущности, зависит от реализации исполняющей среды .NET, но по минимуму состав­ляет восемь байтов, используемых для хранения ключа для типа объекта, а также со­стояния блокировки для многопоточной обработки и флага для указания, является ли
объект закрепленным от перемещения сборщиком мусора. Каждая ссылка на объект требует дополнительных четырех или восьми байтов в зависимости от платформы, на которой запущена исполняющая среда .NET — 32- или 64-разрядной.

Программы C# подвергаются проверке типов как статически (во время компиля­ции), так и во время выполнения (средой CLR).
Статическая проверка типов позволяет компилятору верифицировать коррект­ность программы, не запуская ее. Показанный ниже код даст сбой, т.к. компилятор принудительно применяет статическую типизацию:

Проверка типов во время выполнения выполняется средой CLR, когда реализуется приведение вниз через ссылочное преобразование или распаковка. Например:

События  WinRT  имеют  слегка  отличающуюся  семантику,  заключающуюся  в том,  что присоединение к событию возвращает маркер,  который потребуется для отсоединения от этого события. Компилятор прозрачно устраняет эту брешь (за счет поддержки внутреннего словаря маркеров), поэтому события WinRT можно использовать так, как будто они являются обычными событиями CLR.

Стандартный шаблон событий
В .NET Framework определен стандартный шаблон для написания событий. Его целью является обеспечение согласованности в рамках как .NET Framework, так и пользовательского кода. В основе стандартного шаблона событий находится
System.EventArgs — предопределенный .NET Framework класс, не имеющий членов (кроме статического свойства Empty). Базовый класс EventArgs предназначен для пе­редачи информации событию. В примере Stock мы создадим подкласс EventArgs для передачи старой и новой цены, когда инициируется событие PriceChanged:

Для повторного использования подкласс EventArgs именован в соответствии с содержащейся в нем информацией (а не событием, для которого он будет использо­ваться). Обычно он открывает данные в виде свойств или полей, предназначенных только для чтения.
Имея подкласс EventArgs, далее потребуется выбрать или определить делегат для события. При этом применяются три следующих правила.

  • Он должен иметь возвращаемый тип void.
  • Он должен принимать два аргумента: первый — тип object, а второй — подкласс EventArgs. Первый аргумент указывает ретранслятор события, а второй аргу­мент содержит дополнительную информацию для передачи.
  • Его имя должно заканчиваться на EventHandler.

В .NET Framework определен обобщенный делегат по имени System. EventHandler<>, который удовлетворяет перечисленным правилам:

Многие ключевые возможности, необходимые при программировании, предостав­ляются не языком С#, а типами в .NET Framework. В этой главе мы раскроем роль .NET Framework при решении фундаментальных задач программирования, таких как
виртуальное сравнение эквивалентности, сравнение порядка и преобразование типов. Мы также рассмотрим базовые типы .NET Framework, подобные String, DateTime и Enum. Типы, описанные в этом разделе, находятся в пространстве имен System, со следующими исключениями:

При сравнении двух значений в .NET Framework проводится различие между кон­цепциями сравнения эквивалентности и сравнения порядка. Сравнение эквивалентности предназначено для проверки, являются ли два экземпляра семантически одинаковы­ми; сравнение порядка выясняет, какой из двух экземпляров (если таковые имеются) будет расположен первым в случае расположения их по возрастанию или убыванию.

Мы описали тип enum в C# и показали, как комбинировать его члены, проверять эквивалентность, использовать логические операции и выполнять преоб­разования. Поддержка перечислений C# в .NET Framework расширяется посредством типа System.Enum. Этот тип выступает в двух ролях:

  • предоставляет унификацию типов для всех типов enum;
  • определяет статические служебные методы.

Платформа  .NET  Framework  предоставляет  стандартный  набор  типов  для  хра­нения  и управления  коллекциями  объектов.  Они  включают  списки  с  изменяемыми размерами,  связные  списки,  отсортированные и  несортированные словари,  а также массивы. Из всего перечисленного только массивы являются частью языка С#; осталь­ные коллекции — это просто классы,  экземпляры которых можно создавать подобно любым другим. Типы в .NET Framework для коллекций могут быть разделены на следующие кате­гории:


Выражения запросов внешне похожи на SQL, хотя они существенно отличаются. Запрос LINQ сводится к выражению C# и, таким образом, следует стандартным пра­вилам языка С#. Например, в LINQ нельзя использовать переменную до ее объявле­ния. С другой стороны, в SQL можно ссылаться на псевдоним таблицы в операторе SELECT до его определения в конструкции FROM.
Подзапрос в LINQ — это просто еще одно выражение С#, поэтому никакого спе­циального синтаксиса он не требует. Подзапросы в SQL подчиняются специальным правилам. В LINQ данные логически протекают слева направо через запрос. В SQL порядок в отношении потока данных не так хорошо структурирован. Запрос LINQ состоит из конвейера операций, которые принимают и выдают упорядоченные последова­тельности.Запрос SQL образован из сети конструкций, которые работают в основном с неупорядоченными наборами.

Сущностные классы можно сгенерировать автоматически из базы данных с  использованием  либо  Visual  Studio  (добавив  новый  элемент  проекта LINQ to SQL Classes  (Классы  LINQ to SQL)),  либо инструмента командной строки

Модель Х-DOM  можно  трансформировать  путем  повторного  ее  проецирования. Например,  предположим,  что необходимо трансформировать XML-файл MSBuild, ис­пользуемый компилятором C# и средой Visual Studio для описания проекта, в простой формат, подходящий для генерации отчета. Содержимое файла MSBuild выглядит сле­дующим образом: