Указатель NULL
- это тот, который указывает на никуда. Когда вы разыскиваете указатель p
, вы говорите «дайте мне данные в месте, хранящемся в« p ». Когда p
является нулевым указателем, местоположение, хранящееся в p
, является nowhere
, вы говорите «Дайте мне данные в месте« нигде ». Очевидно, он не может этого сделать, поэтому он выбрасывает NULL pointer exception
.
В общем, это потому, что что-то не было правильно инициализировано.
Это - хороший материал. Сделайте их дополнительными методами, хотя очистить Ваш код немного больше. Например:
//Replaces OnMyEventRaised boiler-plate code
//Usage: SafeInvoker.RaiseEvent(this, MyEventRaised)
public static void Raise(this EventHandler eventToRaise, object sender)
{
EventHandler eventHandler = eventToRaise;
if (eventHandler != null)
eventHandler(sender, EventArgs.Empty);
}
Теперь на Ваших событиях можно звонить: myEvent. Повысьте (это);
Подобные шаблоны работали на меня без проблем. Я не уверен, почему Вы переносите Действие в MethodInvoker все же.
Из-за того, что Бенджол не знает, почему он помещает действие в методинвекере, а брокиклиман должен использовать его как Функция расширения, вот курс очистки:
static class SafeInvoker
{
//Utility to avoid boiler-plate InvokeRequired code
//Usage: myCtrl.SafeInvoke(() => myCtrl.Enabled = false);
public static void SafeInvoke(this Control ctrl, Action cmd)
{
if (ctrl.InvokeRequired)
ctrl.BeginInvoke(cmd);
else
cmd();
}
//Replaces OnMyEventRaised boiler-plate code
//Usage: this.RaiseEvent(myEventRaised);
public static void RaiseEvent(this object sender, EventHandler evnt)
{
if (evnt != null)
evnt(sender, EventArgs.Empty);
}
}
Просто последнее примечание: MethodInvoker
и Действие
- оба делегаты, имеющие точную той же структуру. Из-за этого случая оба заменяются друг другом. Корень этого столкновения происходит от наследия. В начале (.NET 2.0) был всего MethodInvoker
и действие (T)
. Но из-за того, что все, кто использовал действий (T)
, увлекся , чтобы иметь действие
, и обнаружил, что он очень неестественно взять методинвек
. Таким образом, в .NET 3.5 действия
, , действий (T1, T2, T3, T4)
и все функции и все
делегатов, где это тоже добавлено, но MethodInvoker не может быть Удалено больше, не делая никаких изменений.
Если вы можете использовать .NET 3.5, вышеуказанный код в порядке, но если вы закреплены на .NET 2.0, вы можете использовать его как обычную функцию, как раньше, и заменить действие
] по методине
.