Как добавить событие в класс

Скажем, у меня есть класс Frog, он выглядит так:

public class Frog
{
     public int Location { get; set; }
     public int JumpCount { get; set; }


     public void OnJump()
     {
         JumpCount++;
     }

}

Мне нужна помощь в двух вещах:

  1. Я хочу создать событие с именем Jump в определении класса.
  2. Я хочу создать экземпляр класса Frog, а затем создать еще один метод, который будет вызываться при прыжке Frog.
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
46
0
48 778
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

public event EventHandler Jump;
public void OnJump()
{
    EventHandler handler = Jump;
    if (null != handler) handler(this, EventArgs.Empty);
}

тогда

Frog frog = new Frog();
frog.Jump += new EventHandler(yourMethod);

private void yourMethod(object s, EventArgs e)
{
     Console.WriteLine("Frog has Jumped!");
}

спасибо, хотя я не вижу необходимости в этой строке «EventHandler handler = Jump;»

public static 17.09.2008 20:50

это сделано для того, чтобы избежать мертвых обработчиков ... в C# между моментом, когда вы проверяете, является ли обработчик нулевым, и фактическим временем вызова обработчика, метод мог быть удален. Таким образом, вы настраиваете ссылку на то место, куда в настоящее время указывает обработчик, затем проверяете значение null для этой ссылки и вызываете.

Quintin Robinson 17.09.2008 20:53

Будет ли первый фрагмент кода статической глобальной областью видимости? Иначе как он узнает, что делает frog.Jump?

WDUK 07.01.2018 08:37

@publicstatic Относительно обработчика EventHandler = Jump; Теперь (2015) это можно сократить до Jump? .Invoke (this, EventArgs.Empty); См .: stackoverflow.com/questions/28352072/…

erict 25.03.2020 23:09

Вот пример использования обычного EventHandler или настраиваемого делегата. Обратите внимание, что ?. используется вместо ., чтобы гарантировать, что, если событие равно null, оно завершится ошибкой (возврат null)

public delegate void MyAwesomeEventHandler(int rawr);
public event MyAwesomeEventHandler AwesomeJump;

public event EventHandler Jump;

public void OnJump()
{
    AwesomeJump?.Invoke(42);
    Jump?.Invoke(this, EventArgs.Empty);
}

Обратите внимание, что само событие имеет значение NULL только в том случае, если нет подписчиков, и что после вызова событие является потокобезопасным. Таким образом, вы также можете назначить пустой обработчик по умолчанию, чтобы гарантировать, что событие не равно нулю. Обратите внимание, что это технически уязвимо для того, чтобы кто-то другой уничтожил все события (используя GetInvocationList), поэтому используйте его с осторожностью.

public event EventHandler Jump = delegate { };

public void OnJump()
{
    Jump(this, EventArgs.Empty);
}

Я пытаюсь это сделать, чтобы вы могли скопировать этот код.

public event EventHandler yourobjecthere
{
      add { anotherobject.Click += new EventHandler(value); }
      remove { anotherobject.Click -= new EventHandler(value); }
}

Ваша потребность:

  1. + = от добавления
  2. - = от удалить

Или вы можете удвоить это. Пример:

public event EventHandler yourobjecthere
{
      add
      {
           anotherobject.Click += new EventHandler(value);
           anotherobject2.Click += new EventHandler(value);
      }
      remove
      {
           anotherobject.Click -= new EventHandler(value);
           anotherobject2.Click -= new EventHandler(value);
      }
}

Другие вопросы по теме