Quando encadeamento delegados .NET, como são os casos originais (re) utilizadas?
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.
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.