2013-06-03 2 views
2

Чтение о cache-friendly code in this SO question, я хочу знать, могут ли стрелять и обрабатывать события более удобными для кэширования, чем переопределять методы при работе с классами на C# (поскольку в одном из ответов говорится, что следует избегать виртуальных методов, по крайней мере, на C++) , или есть какая-либо лучшая стратегия, чем оба подхода?Являются ли события более безопасными для кэширования кода, чем виртуальные/переопределенные методы в C#?

+0

Попытайтесь понять * почему * виртуальные машины не относятся к кешированию. Как только вы это сделаете, должно быть очевидно, что события еще более недружелюбны. – Jon

+0

Они решают совершенно разные проблемы. Я не понимаю, насколько это действительно сопоставимо. Возможно, вы должны показать пример проблемы, а затем решить ее как с событиями, так и без событий. Тогда сравнение может быть более значимым. – Servy

+0

@Servy, потому что я создал базовый класс Form, который реализует виртуальные методы, которые переопределены во всех производных классах, но мне было интересно, можно ли лучше запускать события, реализованные в производных классах, а не переопределять методы. –

ответ

4

Я хочу знать, если обжиг и обработка событий может быть более кэш-чистые, чем переопределение методов при работе с классами в C#

В общем, нет. События потребуют вызова в отдельный экземпляр класса, который будет находиться в отдельной ячейке памяти. Это будет иметь те же (или, что еще хуже) проблемы с кешем, чем вызовы виртуальных методов.

или есть какая-либо лучшая стратегия, чем оба подхода?

К сожалению, идиоматический C# имеет тенденцию быть небезопасным. Для того, чтобы писать код, совместимый с кэшем C#, вы обычно хотите использовать struct по сравнению с class, избегать виртуальных методов, избегать событий, избегать делегатов (по крайней мере, с закрытием) и т. Д. У Rico Mariani был хороший blog post on Value based programming, который обсуждает многие из этих проблем в подробно.