Скажем, у меня есть класс Frog, он выглядит так:
public class Frog
{
public int Location { get; set; }
public int JumpCount { get; set; }
public void OnJump()
{
JumpCount++;
}
}
Мне нужна помощь в двух вещах:





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!");
}
это сделано для того, чтобы избежать мертвых обработчиков ... в C# между моментом, когда вы проверяете, является ли обработчик нулевым, и фактическим временем вызова обработчика, метод мог быть удален. Таким образом, вы настраиваете ссылку на то место, куда в настоящее время указывает обработчик, затем проверяете значение null для этой ссылки и вызываете.
Будет ли первый фрагмент кода статической глобальной областью видимости? Иначе как он узнает, что делает frog.Jump?
@publicstatic Относительно обработчика EventHandler = Jump; Теперь (2015) это можно сократить до Jump? .Invoke (this, EventArgs.Empty); См .: stackoverflow.com/questions/28352072/…
Вот пример использования обычного 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); }
}
Ваша потребность:
Или вы можете удвоить это. Пример:
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);
}
}
спасибо, хотя я не вижу необходимости в этой строке «EventHandler handler = Jump;»