Pergunta

Say Eu tenho o seguinte código C #:

Action a = TestMethod;
Action b = TestMethod;
Action c = b;
b += a;

testes indica que b não é a mesma instância como c, tão claramente o operador + parece criar uma nova instância do delegado. Será esta uma suposição correta? Faz reutilizar o b instância internamente, ou será que apenas copiar as informações método / target para uma nova instância?

Eu pareço ser incapaz de encontrar a implementação do operador + para os delegados, a classe Delegado não parece contê-lo.

Alguém pode lançar alguma luz sobre esta questão?

A razão que eu estou pedindo é que eu estou criando algumas classes que vai Camada-se em torno de si como cebolas, e a camada mais externa chamará uma camada interna, obter alguns delegados e em seguida, anexar mais métodos para esses delegados, I 'm apenas preocupado que isso irá de alguma mudança maneira os delegados I obter a partir da camada interna, caso em que eu preciso para retornar cópias / clones, em vez de apenas as referências internas.

Note que este é o código puramente internas de minha biblioteca, por isso, enquanto eu sei que a passagem para fora estruturas de dados internas como o que é uma má idéia geral, se eu posso fazê-lo com segurança com estas classes, então eu vou fazê-lo.

Foi útil?

Solução

Como Kent diz, + = usa para Delegate.Combine , e - = usos Delegate.Remove . Ver o meu eventos / delegados artigo para obter mais informações.

O importante é que os delegados são imutáveis ??- chamando Combinar / Remove não muda o delegado que você chamá-lo em tudo - assim você não precisa clone nada. O mesmo é verdadeiro para qualquer outra que você faz com o delegado nada:. Se você começar a lista de invocação e alterar o conteúdo do array retornado, por exemplo, que não vai mudar o que o delegado realmente faz

(Isto é como o comportamento de String, se você quiser uma outra maneira de pensar sobre isso.)

Outras dicas

+= é equivalente a Delegate.Combine(). -= é equivalente a Delegate.Remove(). Cada cria uma nova instância Delegate e retorna-lo.

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