Чтение о cache-friendly code in this SO question, я хочу знать, могут ли стрелять и обрабатывать события более удобными для кэширования, чем переопределять методы при работе с классами на C# (поскольку в одном из ответов говорится, что следует избегать виртуальных методов, по крайней мере, на C++) , или есть какая-либо лучшая стратегия, чем оба подхода?Являются ли события более безопасными для кэширования кода, чем виртуальные/переопределенные методы в C#?
ответ
Я хочу знать, если обжиг и обработка событий может быть более кэш-чистые, чем переопределение методов при работе с классами в C#
В общем, нет. События потребуют вызова в отдельный экземпляр класса, который будет находиться в отдельной ячейке памяти. Это будет иметь те же (или, что еще хуже) проблемы с кешем, чем вызовы виртуальных методов.
или есть какая-либо лучшая стратегия, чем оба подхода?
К сожалению, идиоматический C# имеет тенденцию быть небезопасным. Для того, чтобы писать код, совместимый с кэшем C#, вы обычно хотите использовать struct
по сравнению с class
, избегать виртуальных методов, избегать событий, избегать делегатов (по крайней мере, с закрытием) и т. Д. У Rico Mariani был хороший blog post on Value based programming, который обсуждает многие из этих проблем в подробно.
Попытайтесь понять * почему * виртуальные машины не относятся к кешированию. Как только вы это сделаете, должно быть очевидно, что события еще более недружелюбны. – Jon
Они решают совершенно разные проблемы. Я не понимаю, насколько это действительно сопоставимо. Возможно, вы должны показать пример проблемы, а затем решить ее как с событиями, так и без событий. Тогда сравнение может быть более значимым. – Servy
@Servy, потому что я создал базовый класс Form, который реализует виртуальные методы, которые переопределены во всех производных классах, но мне было интересно, можно ли лучше запускать события, реализованные в производных классах, а не переопределять методы. –