Типы ссылок по умолчанию равны null, чтобы указать, что они не ссылаются на какой-либо объект. Следовательно, если вы попытаетесь получить доступ к объекту, на который ссылаетесь, а его нет, вы получите исключение NullReferenceException.
Для Ex:
SqlConnection connection = null;
connection.Open();
Когда вы запускаете это кода, вы получите:
System.NullReferenceException: Object reference not set to an instance of an object.
Вы можете избежать этой ошибки, например, следующим образом:
if (connection != null){
connection.Open();
}
Примечание. Чтобы избежать этой ошибки, вы всегда должны инициализировать свои объекты прежде чем пытаться что-либо сделать с ними.
Таким образом, вы можете сделать своим издателем формы (и посредником между элементами управления), и все ваши элементы управления будут абонентами, которые будут уведомлены о событии.
Событие, произошедшее в элементе управления, будет уведомление и обработчик событий в форме будут уведомлять другие элементы управления, подписавшиеся на это событие.
Вы можете использовать статическое событие:
public static class MyGlobalEvent {
public static event EventHandler MyEvent;
public static void FireMyEvent(EventArgs args)
{
var evt = MyEvent;
if (evt != null)
evt(args);
}
}
Подпишитесь обычным способом:
MyGlobalEvent.MyEvent += args => Console.WriteLine("Event Was Fired.");
Пожар, как вы считаете нужным:
MyGlobalEvent.FireMyEvent(new EventArgs());
То, что вы описываете, выглядит как шаблон посредника , в котором объекты обмениваются сообщениями. Эти сообщения могут быть реализованы как события, обратные вызовы или любой другой механизм.
Вы можете использовать реализацию, такую как класс MVVM Light Messenger
(эта структура предназначена для использования с WPF и Silverlight, но вы можете получить код для этого конкретного класса и использовать его в WinForms)
// Register for a specific message type
Messenger.Default.Register<TypeOfTheMessage>(this, DoSomething);
...
// Called when someone sends a message of type TypeOfTheMessage
private void DoSomething(TypeOfTheMessage message)
{
// ...
}
// Send a message to all objects registered for this type of message
Messenger.Default.Send(new TypeOfTheMessage(...));
Большое преимущество класса Messenger
в отношении статического события заключается в том, что он использует слабые ссылки , поэтому он не мешает сборке подписанных объектов, что снижает риск утечек памяти.
Подробную информацию о классе Messenger