Почему оператор с нулевым условием обеспечивает безопасность потоков в C#? - PullRequest
1 голос
/ 14 марта 2020

В C# есть современная идиома, в которой используется условно-нулевой оператор для обеспечения безопасности потоков при использовании делегатов. А именно:

Update?.Invoke(this, theArgs);

Почему это работает? Гарантирует ли спецификация C# атомарность в работе? Создает ли условно-нулевой оператор базовую копию своего операнда перед выполнением метода Invoke ()?

1 Ответ

1 голос
/ 14 марта 2020

Нулевой условный оператор примерно эквивалентен:

var handler = this.PropertyChanged;
if (handler != null)
{
    handler(…);
}

Часть, где он создает локальную переменную? Это то, что поможет с безопасностью потока.

Однако это не на 100% надежно. Видите ли, люди использовали этот шаблон раньше. Это был постоянный совет для событий. Но если вы не пометите handler как volatile, компилятор или JiT-компилятор могут отключить его из-за недостаточно используемой переменной. Компилятор, устанавливающий его сам по себе, может предотвратить это опровержение.

Но в конце концов, единственная надежная вещь - это оператор блокировки.

...