Pergunta

No meu código eu estou instanciar um objeto Delphi legado através de uma interface COM. Esta classe precisa ser instanciado várias vezes, de modo a fim de reduzir a sobrecarga de instanciar que eu armazená-lo em um ponto onde 70% de todas as chamadas têm o comum resultando objeto.

No entanto, quando eu alterar o objeto depois que ele é armazenado em cache, as alterações são persistentes no cache também. Isto faz-me pensar que o COM embalagem instância é passada por ref em vez de por valor.
Como posso ter certeza de que o objeto em cache é passado por valor em vez de por ref?

Foi útil?

Solução

Eu acho que, se é possível fazer em tudo, você precisa explicitamente clone uma cópia do objeto e, em seguida, armazenar em cache a cópia. Veja por exemplo o método MemberwiseClone, e outros mencionados em respostas a Clonagem objetos em C # .

Outras dicas

Primeiro, é isso necessário?

Eu não sou um defensor da "medição resolver todos os problemas de desempenho", mas no seu caso, você deve.

A sobrecarga de instanciar um objeto COM (após a primeira penalidade chamada), como tal, é muito baixa - lembre-se que foi projetado para suportar muitos pequenos objetos em computadores de 15 anos atrás. Presumo que a sobrecarga .NET não é muito mais - então a questão é a objetos própria inicialização.

Você pode verificar isso facilmente por instanciar 1000 objetos dentro de um loop (jogar fora a primeira chamada, ele pode ser muito caro e iria estragar a média)

objetos COM são inerentemente por referência
Não há "passar por valor" para os objetos, como sua interface básica é uma referência contados apontador para a instância e COM não expõe um método genérico "clone".

solução possível: Copy-on-Write
Se um se instanciação é realmente caro, e a maioria das chamadas pode ser feito através de uma instância padrão, você pode implementar um esquema de copy-on-write.

Você precisa criar uma classe de invólucro que mantém uma referência para a instância padrão e uma referência a uma instância privada inicializado a 0.

Enquanto a instância privada é null, todas as funções getter para a frente para a instância padrão, otherwis, eles para a frente para a instância privada.

Cada setter / call modificador para a frente para a instância privada, criando-lo quando ele não existe.

Este iria atrasar a criação da instância privada para a primeira chamada mutação. No entanto, você tem que envolver toda a todas as interfaces de interesse para esse componente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top