2014-02-06 1 views
0

Я иду через этот код ниже:Почему дополнительный оператор if проверяет, имеет ли событие значение null до его вызова?

public delegate void PersonArrivedEventHandler(string personName, byte[] personId); 

    public class SCLib 
    { 
     public event personArrivedEventHandler personrrived; 

     public SCLib() 
     { 
      // Simulate that the person arrived after 2000 milli-seconds. 
      Task.Run(() => 
      { 
       System.Threading.Thread.Sleep(2000); 
       OnPersonArrived("personName", new byte[] { 0x20, 0x21, 0x22 }); 
      }); 
     } 

     protected virtual void OnPersonArrived(string smartCardReaderName, byte[] smartCardId) 
     { 
      if (this.personArrived != null) 
      { 
       PersonArrived(personName, personId); 
      } 
     } 
    } 

Но, я не знаю, каково значение этой линии, if (this.personArrived != null).

Зачем нужна эта проверка? Есть ли значение if statement здесь? Я удалил эту строку и запустил программу, и все работает по-прежнему.

Спасибо.

+1

«Я только что удалил все дымовые извещатели из дома, и все в нем продолжало работать, как и раньше, поэтому я считаю, что детекторы дыма не нужны». Нет: все * кроме детекторов дыма * работало по-прежнему. Когда вы удаляете систему безопасности, в которой система безопасности больше не работает. –

+0

@EricLippert: Хорошая аналогия. Имело смысл. –

ответ

1

Если мероприятие не подписано потребителем class, то при вызове event возникнет исключение, так как PersonArrived имеет значение null, если не подписан.

+0

спасибо, и только что проверили, не подписываясь на мероприятие, и оно было пустым, как вы сказали. Но внутренне как класс знает, что кто-то подписал или не подписался на его мероприятие? –

+1

Это будет null, если объект, на который он будет вызван, не подписал его. – Adil

+0

Спасибо. Имеет смысл. «Но внутренне как класс знает, что кто-то подписал или не подписался на его событие?». Ну, ответ: через его состояние объекта. –

1

Если вы используете событие, которое вы не назначили обработчику, оно будет генерировать исключение, поскольку оно равно null, поэтому вам нужно проверить его перед запуском события.

1

Потому что это будет null, если делегаты не будут прикреплены к событию. Если вы попытаетесь вызвать такое событие null, вы получите стандарт NullReferenceException.

1

«События» подписываются объектом класса с помощью add handler.

SCLibObject.personrrived += new personArrivedEventHandler(somemethod)

Если объект класса не подписываются событие, то вы получите NullReferenceException. Поэтому перед вызовом событий проверьте, является ли оно нулевым или нет.

1

В многопоточном приложении перед вызовом следует хранить обработчики событий в локальной переменной. См. this SO answer, this blog post from Eric Lippert и this SO answer для получения более подробной информации.

+0

Спасибо. Ссылки кажутся действительно полезными. –

Смежные вопросы