Последнее ключевое слово С#, связанное с небезопасным кодом — sizeof. Как и в C++, ключевое слово sizeof в C# используется для получения размера в байтах встроенного типа данных, но не специального типа, разве только в небезопасном контексте. Например, показанный ниже метод не нуждается в объявлении "небезопасным", т.к. все аргументы ключевого слова sizeof относятся к встроенным типам:

static void UseSizeOfOperator()

{

  Console.WriteLine("The size of short is {0}.", sizeof(short));

  Console.WriteLine("The size of int is {0}.", sizeof(int));

  Console.WriteLine("The size of long is {0}.", sizeof(long));

}

Тем не менее, если вы хотите получить размер специальной структуры Point, то метод UseSizeOfOperator() придется модифицировать (обратите внимание на добавление ключевого слова unsafe):

unsafe static void UseSizeOfOperator()

{

  ...

  unsafe {

    Console.WriteLine("The size of Point is {0}.", sizeof(Point));

  }

}

Итак, обзор нескольких более сложных средств языка программирования C# завершен. Напоследок снова необходимо отметить, что в большинстве проектов .NET эти средства могут вообще не понадобиться (особенно указатели). Тем не менее, как будет показано в последующих главах, некоторые средства действительно полезны (и даже обязательны) при работе с API-интерфейсами LINQ, в частности расширяющие методы и анонимные типы. 

<p id="AutBody_Root443">Резюме</p>

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

Затем мы рассмотрели роль расширяющих методов и анонимных типов. Как вы увидите в главе 13, эти средства удобны при работе с API-интерфейсами LINQ (хотя при желании их можно применять в коде повсеместно). Вспомните, что анонимные методы позволяют быстро моделировать "форму" типа, в то время как расширяющие методы дают возможность добавлять новую функциональность к типам без необходимости в определении подклассов.

Финальная часть главы была посвящена небольшому набору менее известных ключевых слов (sizeof, unsafe и т.п.); наряду с ними рассматривалась работа с низкоуровневыми типами указателей. Как было установлено в процессе исследования типов указателей, в большинстве приложений C# их никогда не придется использовать.

<p id="AutBody_Root444">Глава 12</p><p>Делегаты, события и лямбда-выражения</p>

Вплоть до настоящего момента в большинстве разработанных приложений к операторам верхнего уровня внутри файла Program.cs добавлялись разнообразные порции кода, тем или иным способом отправляющие запросы к заданному объекту. Однако многие приложения требуют, чтобы объект имел возможность обращаться обратно к сущности, которая его создала, используя механизм обратного вызова. Хотя механизмы обратного вызова могут применяться в любом приложении, они особенно важны в графических пользовательских интерфейсах, где элементы управления (такие как кнопки) нуждаются в вызове внешних методов при надлежащих обстоятельствах (когда произведен щелчок на кнопке, курсор мыши наведен на поверхность кнопки и т.д.).

В рамках платформы .NET Core предпочтительным средством определения и реагирования на обратные вызовы в приложении является тип делегата. По существу тип делегата .NET Core — это безопасный в отношении типов объект, "указывающий" на метод или список методов, которые могут быть вызваны позднее. Тем не менее, в отличие от традиционного указателя на функцию C++ делегаты представляют собой классы, которые обладают встроенной поддержкой группового и асинхронного вызова методов.

На заметку! В предшествующих версиях .NET делегаты обеспечивали вызов асинхронных методов с помощью BeginInvoke()/EndInvoke(). Хотя компилятор по-прежнему генерирует методы BeginInvoke()/EndInvoke(), в .NET Core они не поддерживаются. Причина в том, что шаблон с IAsyncResult и BeginInvoke()/EndInvoke(), используемый делегатами, был заменен асинхронным шаблоном на основе задач. Асинхронное выполнение подробно обсуждается в главе 15.

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

Перейти на страницу:

Похожие книги