Я извиняюсь, но мне одному кажется что MS решили закопать свою кроссплатформенную инициативу. Ну точнее не закопать, а просто забить на неё… Лично я себя обманутым ощущаю слегка, ну т.е. я конечно могу есть кактус и он довольно-таки вкусный (C#/.Net Core), но тем не менее кактусом остается (поддержка не оч. ни от Майков ни от сторонних).
Я как-то не понимаю зачем такая статья, проблема то небольшая. Магические числа, это первое про что пишут в книгах. Пиши код, чтобы он читался как текст. Лично я предпочитаю длинные имена классов/методов/параметров, однако не любитель повсеместных комментариев.
Со статьей, в целом, я согласен. Однако мой опыт отличается от Вашего, нынче наблюдаю обратный процесс, люди начитавшись книг по ООП(что само по себе и неплохо) начинают выделять интерфейсы и творить «энти фабрики, стратегии» там где это излишне, так ещё для большей расширяемости интерфейс выкидывают в отдельную либу, и мы имеем пятьсотмиллионов проектов). Если расширяемость в данном месте не предполагается, можно и со switch начать, а далее перескочить недолго(если конечно не доводить до портянок в десяток case, которые используются в десятке мест).
Приеду домой проверю, но по-моему, т.к. события и делегаты immutable, то поменять то поменяет список(т.е. создаст новый и заменит), а тот старый выполнится до конца.
Честно говоря не понял что вы имеете ввиду, Thread.VolatileRead(ref changeDevNum) просто несёт «побочную» функцию защиты от оптимизации компилятора.
А что вы имеете ввиду про защиту от модификаций из другого потока? Можно модифицировать в любом потоке.
Ну она спасёт, если сделать
var handler = Thread.VolatileRead(ref changeDevNum);
if(handler!=null)
handler(num);
Т.к. в противном случае по стандарту, компилятор может соптимизировать код удалив локальную переменную, но по факту такого нет ни в Mono, ни в .Net
Я как-то не понимаю зачем такая статья, проблема то небольшая. Магические числа, это первое про что пишут в книгах. Пиши код, чтобы он читался как текст. Лично я предпочитаю длинные имена классов/методов/параметров, однако не любитель повсеместных комментариев.
А что вы имеете ввиду про защиту от модификаций из другого потока? Можно модифицировать в любом потоке.
var handler = Thread.VolatileRead(ref changeDevNum);
if(handler!=null)
handler(num);
Т.к. в противном случае по стандарту, компилятор может соптимизировать код удалив локальную переменную, но по факту такого нет ни в Mono, ни в .Net
Вызов события производят обычно таким образом
var handler = changeDevNum;
if(handler !=null)
handler(num);
Ну или в C# 6.0 handler?.Invoke(num).