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

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

Читать бесплатно Язык программирования C#9 и платформа .NET5 - Троелсен Эндрю. Жанр: Базы данных год 2004. Так же читаем полные версии (весь текст) онлайн без регистрации и SMS на сайте kniga-online.club или прочесть краткое содержание, предисловие (аннотацию), описание и ознакомиться с отзывами (комментариями) о произведении.
Перейти на страницу:

{

  /// Если этот автомобиль сломан, то отправить сообщение об этом.

  if (_carIsDead)

   {

    _listOfHandlers?.Invoke("Sorry, this car is dead...");

  }

  else

  {

    CurrentSpeed += delta;

    // Автомобиль почти сломан?

    if (10 == (MaxSpeed - CurrentSpeed))

    {

      _listOfHandlers?.Invoke("Careful buddy! Gonna blow!");

    }

    if (CurrentSpeed >= MaxSpeed)

    {

      _carIsDead = true;

    }

    else

    {

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

    }

  }

}

Обратите внимание, что при попытке вызова методов, поддерживаемых переменной-членом _listOfHandlers, используется синтаксис распространения null. Причина в том, что создание таких объектов посредством вызова вспомогательного метода RegisterWithCarEngine() является задачей вызывающего кода. Если вызывающий код не вызывал RegisterWithCarEngine(), а мы попытаемся обратиться к списку вызовов делегата, то получим исключение NullReferenceException во время выполнения. Теперь, когда инфраструктура делегатов готова, внесите в файл Program.cs следующие изменения:

using System;

using CarDelegate;

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

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

Car c1 = new Car(&quot;SlugBug&quot;, 100, 10);

<b>// Сообщить объекту Car, какой метод вызывать,</b>

<b>// когда он пожелает отправить сообщение.</b>

c1.RegisterWithCarEngine(

  new Car.CarEngineHandler(OnCarEngineEvent));

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

Console.WriteLine(&quot;***** Speeding up *****&quot;);

for (int i = 0; i &lt; 6; i++)

{

  c1.Accelerate(20);

}

Console.ReadLine();

<b>// Цель для входящих сообщений.</b>

(window.adrunTag = window.adrunTag || []).push({v: 1, el: 'adrun-4-390', c: 4, b: 390})

static void OnCarEngineEvent(string msg)

{

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

  Console.WriteLine(&quot;=&gt; {0}&quot;, msg);

  Console.WriteLine(&quot;********************n&quot;);

}

Код начинается с создания нового объекта Car. Поскольку вас интересуют события, связанные с двигателем, следующий шаг заключается в вызове специальной регистрационной функции RegisterWithCarEngine(). Вспомните, что метод RegisterWithCarEngine() ожидает получения экземпляра вложенного делегата CarEngineHandler, и как в случае любого делегата, в параметре конструктора передается метод, на который он должен указывать. Трюк здесь в том, что интересующий метод находится в классе Program! Обратите также внимание, что метод OnCarEngineEvent() полностью соответствует связанному делегату, потому что принимает string и возвращает void. Ниже показан вывод приведенного примера:

***** Delegates as event enablers *****

***** Speeding up *****

CurrentSpeed = 30

CurrentSpeed = 50

CurrentSpeed = 70

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

=&gt; Careful buddy! Gonna blow!

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

CurrentSpeed = 90

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

=&gt; Sorry, this car is dead...

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

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

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

public class Car

{

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

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

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

  public void RegisterWithCarEngine(

    CarEngineHandler methodToCall)

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

Троелсен Эндрю читать все книги автора по порядку

Троелсен Эндрю - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки kniga-online.club.


Язык программирования C#9 и платформа .NET5 отзывы

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


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

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

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


Прокомментировать
Подтвердите что вы не робот:*
Подтвердите что вы не робот:*