Во-первых, нужно ли это?
Я не сторонник "измерения решить все проблемы производительности", но в вашем случае, вы должны.
Затраты на создание экземпляра COM-объекта (после штрафа за первый вызов) как таковые очень малы - помните, что он был разработан, чтобы позволить себе множество небольших объектов на компьютерах 15 лет назад. Я предполагаю, что издержки .NET не намного больше - поэтому вопрос заключается в собственной инициализации объектов.
Вы можете легко это проверить, создав 1000 объектов в узком цикле (отбросьте первый вызов, это может быть очень дорого и может испортить среднее значение)
COM-объекты по своей сути являются ссылками
Для объектов COM «передачи по значению» не существует, поскольку их базовый интерфейс представляет собой указатель с подсчетом ссылок на экземпляр, а COM не предоставляет общий метод «Клон».
возможное решение: Копировать при записи
Если только если создание экземпляра стоит действительно дорого, а большинство вызовов можно выполнить через экземпляр по умолчанию, вы можете реализовать схему копирования при записи.
Вам необходимо создать класс-оболочку, который содержит ссылку на экземпляр по умолчанию и ссылку на частный экземпляр, инициализированный значением 0.
Пока частный экземпляр null
, все функции-получатели перенаправляют в экземпляр по умолчанию, в противном случае они пересылают в частный экземпляр.
Каждый вызов сеттера / мутатора перенаправляется в закрытый экземпляр, создавая его, когда он не существует.
Это задержит создание частного экземпляра для первого изменяющегося вызова. Тем не менее, вы должны обернуть все интерфейсы, представляющие интерес для этого компонента.