Существует пример кода в разделе о событиях в книге о 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;
Что является причиной для создания локальной копии события (тик и закончил) и повышение события через него? Это обычная практика и имеет какой-то смысл? Я попытался, но не смог получить его из книги.
Событие действует как тип значения при копировании новых переменных. Но это неявный тип ref, который ведет себя так же, как мы имеем дело с двумя копиями типа ref. Разве это небезопасное поведение для неизменяемого объекта? –
Не tick = Tick означает, что тик относится к тому же набору методов, которые привязаны к тику, и если я null Tick tick тоже стал null? – Dork
@Dork - без изменения 'Tick' не изменяется' tick'. Когда 'tick' присваивается эталонная установка« Tick »в ссылку на разницу (даже null), не изменяется« tick ». Это точно так же, как 'string s1 =" 1234 "; строка s2 = s1; s1 = null; '- в конце' s2' по-прежнему «1234», а не null. – shf301