Вопрос

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

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


     public void OnJump()
     {
         JumpCount++;
     }

}

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

  1. Я хочу создать событие с именем Jump в определении класса.
  2. Я хочу создать экземпляр класса Frog, а затем создать еще один метод, который будет вызываться при прыжке Frog.
Это было полезно?

Решение

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!");
}

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

@КК:Почему вы создаете локальную копию pf Jump?Дополнительно можно сохранить последующий тест, слегка изменив объявление события:

public event EventHandler Jump = delegate { };

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

Вот пример использования обычного 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);
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top