2013-02-16 2 views
1

Существует пример кода в разделе о событиях в книге о C#:Работа с событиями. Поднятие из местного вара

class CountDown 
{ 
    private uint _seconds; 
    public CountDown(uint seconds) 
    { 
     _seconds = seconds; 
    } 
    public void Start() 
    { 
     new Thread(() => 
     { 
      uint n = _seconds; 
      while (n > 0u) 
      { 
       var tick = Tick;    ///?????? 
       if (tick != null) 
        tick(n); 

       Thread.Sleep(1000); 
       n--; 
      } 
      var finished = Finished;   ///?????? 
      if (finished != null) 
       finished(); 
     }).Start(); 
    } 
} 
    public event Action<uint> Tick; 
    public event Action Finished; 

Что является причиной для создания локальной копии события (тик и закончил) и повышение события через него? Это обычная практика и имеет какой-то смысл? Я попытался, но не смог получить его из книги.

ответ

3

В чем причина создания локального экземпляра события (галочка и завершение) и события с его помощью?

Это исключает возможность Tickстановится нулевым после проверки недействительности, но перед тем вызов. Если у вас:

if (Tick != null) 
{ 
    Tick(n); 
} 

... и последний слушатель был отписался, когда ты уже попал в «если» тело, вы получите NullReferenceException.

+0

Событие действует как тип значения при копировании новых переменных. Но это неявный тип ref, который ведет себя так же, как мы имеем дело с двумя копиями типа ref. Разве это небезопасное поведение для неизменяемого объекта? –

+0

Не tick = Tick означает, что тик относится к тому же набору методов, которые привязаны к тику, и если я null Tick tick тоже стал null? – Dork

+2

@Dork - без изменения 'Tick' не изменяется' tick'. Когда 'tick' присваивается эталонная установка« Tick »в ссылку на разницу (даже null), не изменяется« tick ». Это точно так же, как 'string s1 =" 1234 "; строка s2 = s1; s1 = null; '- в конце' s2' по-прежнему «1234», а не null. – shf301

0

Это потому, что между вами nullchecking событие и его называют, то, возможно, уже отписался, что делает событие null, что бы бросить (вероятно, необработанное) NullReferenceException, который будет раздражать пользователей, мягко говоря, ,

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