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 ... 153 154 155 156 157 158 159 160 161 ... 407
    Перейти на страницу:
    Car Object *****

    => Careful buddy! Gonna blow!

    ***********************************

    CurrentSpeed = 90

    ***** Message From Car Object *****

    => Sorry, this car is dead...

    ***********************************

    Включение группового вызова

    Вспомните, что делегаты .NET Core обладают встроенной возможностью группового вызова. Другими словами, объект делегата может поддерживать целый список методов для вызова, а не просто единственный метод. Для добавления нескольких методов к объекту делегата вместо прямого присваивания применяется перегруженная операция +=. Чтобы включить групповой вызов в классе Car, можно модифицировать метод RegisterWithCarEngine():

    public class Car

    {

      // Добавление поддержки группового вызова.

      // Обратите внимание на использование операции +=,

      // а не обычной операции присваивания (=).

      public void RegisterWithCarEngine(

        CarEngineHandler methodToCall)

      {

        _listOfHandlers += methodToCall;

      }

      ...

    }

    Когда операция += используется с объектом делегата, компилятор преобразует ее в вызов статического метода Delegate.Combine(). На самом деле можно было бы вызывать Delegate.Combine() напрямую, однако операция += предлагает более простую альтернативу. Хотя нет никакой необходимости в модификации текущего метода RegisterWithCarEngine(), ниже представлен пример применения Delegate.Combine() вместо операции +=:

    public void RegisterWithCarEngine( CarEngineHandler methodToCall )

    {

      if (_listOfHandlers == null)

      {

        _listOfHandlers = methodToCall;

      }

      else

      {

        _listOfHandlers =

          Delegate.Combine(_listOfHandlers, methodToCall)

            as CarEngineHandler;

      }

    }

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

    Console.WriteLine("***** Delegates as event enablers *****n");

    // Создать объект Car.

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

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

    c1.RegisterWithCarEngine(

      new Car.CarEngineHandler(OnCarEngineEvent));

    c1.RegisterWithCarEngine(

      new Car.CarEngineHandler(OnCarEngineEvent2));

    // Увеличить скорость (это инициирует события).

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

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

    {

      c1.Accelerate(20);

    }

    Console.ReadLine();

    // Теперь есть ДВА метода, которые будут

    // вызываться Car при отправке уведомлений.

    static void OnCarEngineEvent(string msg)

    {

      Console.WriteLine("n*** Message From Car Object ***");

      Console.WriteLine("=> {0}", msg);

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

    }

    static void OnCarEngineEvent2(string msg)

    {

      Console.WriteLine("=> {0}", msg.ToUpper());

    }

    Удаление целей из списка вызовов делегата

    В классе Delegate также определен статический метод Remove(), который позволяет вызывающему коду динамически удалять отдельные методы из списка вызовов объекта делегата. В итоге у вызывающего кода появляется возможность легко "отменять подписку" на заданное уведомление во время выполнения. Хотя метод Delegate.Remove() допускается вызывать в коде напрямую, разработчики C# могут использовать в качестве удобного сокращения операцию -=. Давайте добавим в класс Car новый метод, который позволяет вызывающему коду исключать метод из списка вызовов:

    public class Car

    {

      ...

      public void UnRegisterWithCarEngine(CarEngineHandler methodToCall)

      {

        _listOfHandlers -= methodToCall;

      }

    }

    При таком обновлении класса Car прекратить получение уведомлений от второго обработчика можно за счет изменения вызывающего кода следующим образом:

    Console.WriteLine("***** Delegates as event enablers *****n");

    // Создать объект Car.

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

    c1.RegisterWithCarEngine(

      new Car.CarEngineHandler(OnCarEngineEvent));

    // На этот раз сохранить объект делегата, чтобы позже

    // можно было отменить регистрацию.

    Car.CarEngineHandler handler2 =

      new Car.CarEngineHandler(OnCarEngineEvent2);

    c1.RegisterWithCarEngine(handler2);

    // Увеличить скорость (это инициирует события).

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

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

    {

      c1.Accelerate(20);

    }

    // Отменить регистрацию второго обработчика.

    c1.UnRegisterWithCarEngine(handler2);

    // Сообщения в верхнем регистре больше не выводятся.

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

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

    {

      c1.Accelerate(20);

    }

    Console.ReadLine();

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

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

     В предыдущем примере CarDelegate явно создавались экземпляры класса делегата Car.CarEngineHandler для регистрации и отмены регистрации на получение уведомлений:

    Console.WriteLine("***** Delegates as event enablers *****n");

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

    c1.RegisterWithCarEngine(new Car.CarEngineHandler(OnCarEngineEvent));

    Car.CarEngineHandler handler2 =

      new Car.CarEngineHandler(OnCarEngineEvent2);

    c1.RegisterWithCarEngine(handler2);

    ...

    Конечно, если необходимо вызывать любые унаследованные члены класса MulticastDelegate или Delegate, то проще всего вручную создать переменную делегата. Однако в большинстве случаев иметь дело с внутренним устройством объекта делегата не требуется. Объект делегата обычно придется применять только для передачи имени метода в параметре конструктора.

    Для простоты в языке C# предлагается сокращение, называемое групповым преобразованием методов. Это средство позволяет указывать вместо объекта делегата прямое имя метода, когда вызываются методы, которые принимают делегаты в качестве аргументов.

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

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

    ...

    Console.WriteLine("***** Method Group Conversion *****n");

    Car c2 = new Car();

    // Зарегистрировать простое имя метода.

    c2.RegisterWithCarEngine(OnCarEngineEvent);

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

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

    {

      c2.Accelerate(20);

    }

    // Отменить регистрацию простого имени метода.

    c2.UnRegisterWithCarEngine(OnCarEngineEvent);

    // Уведомления больше не поступают!

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

    {

      c2.Accelerate(20);

    }

    Console.ReadLine();

    Обратите

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

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


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

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

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


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

    Новые отзывы

    1. Анна Анна15 июнь 07:43 [spoiler][книга интересная,но не полная и к концу главы повторяются.... Кириленко Ирина – Бирюк
    2. Вера Вера15 июнь 01:46 Благодарю Автора!!!! Хорошо,что все хорошо кончается! Сюжет-захватывает!!!... Звезда+1 - Алайна Салах
    3. Борис Борис14 июнь 00:50 Колокола в России тем и отличались от западных что раскачиаали именно язык колокола,а не сам колокол! Авторы что-жертвы ЕГЭ? Не... Соединенные Штаты России 3 - Полина Ром
    Все комметарии
    Новинки бесплатной онлайн библиотеки