LoveRead.info » Книги » Разная литература » Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен

Книгу Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен читаем онлайн бесплатно полную версию! Чтобы начать читать не надо регистрации. Напомним, что читать онлайн вы можете не только на компьютере, но и на андроид (Android), iPhone и iPad. Приятного чтения!

178 0 18:04, 26-08-2023
Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен
26 август 2023

Книга Язык программирования C#9 и платформа .NET5 - Эндрю Троелсен читать онлайн бесплатно без регистрации

В 10-м издании книги описаны новейшие возможности языка C# 9 и .NET 5 вместе с подробным "закулисным" обсуждением, призванным расширить навыки критического мышления разработчиков, когда речь идет об их ремесле. Книга охватывает ASP.NET Core, Entity Framework Core и многое другое наряду с последними обновлениями унифицированной платформы .NET, начиная с улучшений показателей производительности настольных приложений Windows в .NET 5 и обновления инструментария XAML и заканчивая расширенным рассмотрением файлов данных и способов обработки данных. Все примеры кода были переписаны с учетом возможностей последнего выпуска C# 9.

    1 ... 156 157 158 159 160 161 162 163 164 ... 407
    Перейти на страницу:

    "За кулисами" событий

    Когда компилятор C# обрабатывает ключевое слово event, он генерирует два скрытых метода, один с префиксом add_, а другой с префиксом remove_. За префиксом следует имя события С#. Например, событие Exploded дает в результате два скрытых метода с именами add_Exploded() и remove_Exploded(). Если заглянуть в код CIL метода add_AboutToBlow(), то можно обнаружить вызов метода Delegate.Combine(). Взгляните на частичный код CIL:

    .method public hidebysig specialname instance void  add_AboutToBlow(

      class [System.Runtime]System.EventHandler`1<class CarEvents.

             CarEventArgs> 'value') cil

      managed

      {

         ...

         IL_000b: call class [System.Runtime]System.Delegate

                             [System.Runtime]System.

         Delegate::Combine(class [System.Runtime]System.Delegate,

                           class [System.Runtime]System.Delegate)

         ...

      } // end of method Car::add_AboutToBlow

    Как и можно было ожидать, метод remove_AboutToBlow() будет вызывать Delegate.Remove():

    public hidebysig specialname instance void  remove_AboutToBlow (

      class [System.Runtime]System.EventHandler`1

        <class CarEvents.CarEventArgs> 'value') cil

      managed

      {

        ...

        IL_000b:  call class [System.Runtime]System.Delegate

                             [System.Runtime]System.

             Delegate::Remove(class [System.Runtime]System.Delegate,

                              class [System.Runtime]System.Delegate)

        ...

    }

    Наконец, в коде CIL, представляющем само событие, используются директивы .addon и .removeon для отображения на имена корректных методов add_XXX() и remove_XXX(), подлежащих вызову:

    .event class [System.Runtime]System.EventHandler`1

          <class CarEvents.CarEventArgs> AboutToBlow

    {

      .addon instance void CarEvents.Car::add_AboutToBlow(

        class [System.Runtime]System.EventHandler`1

       <class CarEvents.CarEventArgs>)

      .removeon instance void CarEvents.Car::remove_AboutToBlow(

        class [System.Runtime]System.EventHandler`1

       <class CarEvents.CarEventArgs>)

    } // end of event Car::AboutToBlow

    Теперь, когда вы понимаете, каким образом строить класс, способный отправлять события C# (и знаете, что события — всего лишь способ сэкономить время на наборе кода), следующий крупный вопрос связан с организацией прослушивания входящих событий на стороне вызывающего кода.

    Прослушивание входящих событий

    События C# также упрощают действие по регистрации обработчиков событий на стороне вызывающего кода. Вместо того чтобы указывать специальные вспомогательные методы, вызывающий код просто применяет операции += и -= напрямую (что приводит к внутренним вызовам методов add_XXX() или remove_XXX()). При регистрации события руководствуйтесь показанным ниже шаблоном:

    // ИмяОбъекта.ИмяСобытия +=

    // new СвязанныйДелегат(функцияДляВызова);

    Car.CarEngineHandler d =

      new Car.CarEngineHandler(CarExplodedEventHandler);

    myCar.Exploded += d;

    Отключить от источника событий можно с помощью операции -= в соответствии со следующим шаблоном:

    // ИмяОбъекта.ИмяСобытия - =

    // СвязанныйДелегат(функцияДляВызова);

    myCar.Exploded -= d;

    Кроме того, с событиями можно использовать синтаксис группового преобразования методов:

    Car.CarEngineHandler d = CarExplodedEventHandler;

    myCar.Exploded += d;

    При наличии таких весьма предсказуемых шаблонов переделайте вызывающий код, применив на этот раз синтаксис регистрации событий С#:

    Console.WriteLine("***** Fun with Events *****n");

    Car c1 = new Car("SlugBug", 100, 10);

    // Зарегистрировать обработчики событий.

    c1.AboutToBlow += CarIsAlmostDoomed;

    c1.AboutToBlow += CarAboutToBlow;

    Car.CarEngineHandler d = CarExploded;

    c1.Exploded += d;

    Console.WriteLine("***** Speeding up *****");

    for (int i = 0; i < 6; i++)

    {

      c1.Accelerate(20);

    }

    // Удалить метод CarExploded() из списка вызовов.

    c1.Exploded -= d;

    Console.WriteLine("n***** Speeding up *****");

    for (int i = 0; i < 6; i++)

    {

      c1.Accelerate(20);

    }

    Console.ReadLine();

    static void CarAboutToBlow(string msg)

    {

      Console.WriteLine(msg);

    }

    static void CarIsAlmostDoomed(string msg)

    {

      Console.WriteLine("=> Critical Message from Car: {0}", msg);

    }

    static void CarExploded(string msg)

    {

      Console.WriteLine(msg);

    }

    Упрощение регистрации событий с использованием Visual Studio

    Среда Visual Studio предлагает помощь в процессе регистрации обработчиков событий. В случае применения синтаксиса += при регистрации событий открывается окно IntelliSense, приглашающее нажать клавишу <ТаЬ> для автоматического завершения связанного экземпляра делегата (рис. 12.1), что достигается с использованием синтаксиса групповых преобразований методов.

    После нажатия клавиши <ТаЬ> будет сгенерирован новый метод, как показано на рис. 12.2.

    Обратите внимание, что код заглушки имеет корректный формат цели делегата (кроме того, метод объявлен как static, т.к. событие было зарегистрировано внутри статического метода):

    static void NewCar_AboutToBlow(string msg)

    {

      throw new NotImplementedException();

    }

    Средство IntelliSense доступно для всех событий .NET Core, ваших событий и событий из библиотек базовых классов.Такая возможность IDE-среды значительно экономит время, избавляя от необходимости выяснять с помощью справочной системы подходящий тип делегата для применения с заданным событием и формат целевого метода делегата.

    Создание специальных аргументов событий

    По правде говоря, в текущую итерацию класса Car можно было бы внести последнее усовершенствование, которое отражает рекомендованный Microsoft шаблон событий. Если вы начнете исследовать события, отправляемые определенным типом из библиотек базовых классов, то обнаружите, что первый параметр лежащего в основе делегата имеет тип System.Object, в то время как второй — тип, производный от System.EventArgs.

    Параметр System.Object представляет ссылку на объект, который отправляет событие (такой как Car), а второй параметр — информацию, относящуюся к обрабатываемому событию. Базовый класс System.EventArgs представляет событие, которое не сопровождается какой-либо специальной информацией:

    public class EventArgs

    {

      public static readonly EventArgs Empty;

      public EventArgs();

    }

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

    using System;

    namespace CarEvents

    {

      public class CarEventArgs : EventArgs

      {

        public readonly string msg;

        public CarEventArgs(string message)

        {

          msg = message;

        }

      }

    }

    Теперь можно модифицировать тип делегата CarEngineHandler, как показано ниже (события не изменятся):

    public class Car

    {

      public delegate void

    1 ... 156 157 158 159 160 161 162 163 164 ... 407
    Перейти на страницу:
    1. Жалоба
    Отзывы - 0

    Прочитали книгу? Предлагаем вам поделится своим отзывом от прочитанного(прослушанного)! Ваш отзыв будет полезен читателям, которые еще только собираются познакомиться с произведением.


    Уважаемые читатели, слушатели и просто посетители нашей библиотеки! Просим Вас придерживаться определенных правил при комментировании литературных произведений.

    • 1. Просьба отказаться от дискриминационных высказываний. Мы защищаем право наших читателей свободно выражать свою точку зрения. Вместе с тем мы не терпим агрессии. На сайте запрещено оставлять комментарий, который содержит унизительные высказывания или призывы к насилию по отношению к отдельным лицам или группам людей на основании их расы, этнического происхождения, вероисповедания, недееспособности, пола, возраста, статуса ветерана, касты или сексуальной ориентации.
    • 2. Просьба отказаться от оскорблений, угроз и запугиваний.
    • 3. Просьба отказаться от нецензурной лексики.
    • 4. Просьба вести себя максимально корректно как по отношению к авторам, так и по отношению к другим читателям и их комментариям.

    Надеемся на Ваше понимание и благоразумие. С уважением, администратор LoveRead.info.


    Установить VPN и читай слушай бесплатно

    Новые отзывы

    1. Борис Борис14 июнь 00:50 Колокола в России тем и отличались от западных что раскачиаали именно язык колокола,а не сам колокол! Авторы что-жертвы ЕГЭ? Не... Соединенные Штаты России 3 - Полина Ром
    2. Людмила Хофман Людмила Хофман10 июнь 22:13 У меня перевернулся мир после прочтения ваших книг! Так приятно и чисто на душе, ведь по сути неважно кто с кем , а только любовь... Долгая игра - Рейчел Рид
    3. Анна Анна08 июнь 11:28 Спасибо за новую историю жизни и любви на сайте,прочитала с удовольствием .... Давай поженимся - Юлия Резник
    Все комметарии
    Новинки бесплатной онлайн библиотеки