Pregunta

Digamos que tengo el siguiente código C #:

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

Las pruebas indican que b no es la misma instancia que c , por lo que claramente el operador + parece crear una nueva instancia del delegado . ¿Es esta una suposición correcta? ¿Reutiliza la instancia de b internamente o simplemente copia la información del método / destino a una nueva instancia?

Parece que no puedo encontrar la implementación del operador + para los delegados, la clase Delegate no parece contenerlo.

¿Alguien puede arrojar algo de luz sobre este tema?

La razón por la que pregunto es que estoy creando algunas clases que se superpondrán entre sí como cebollas, y la capa más externa llamará una capa interna, obtendrá algunos delegados y luego adjuntará más métodos a esos delegados, yo Me preocupa que al hacerlo cambie de alguna manera los delegados que obtengo de la capa interna, en cuyo caso necesito devolver copias / clones, en lugar de solo las referencias internas.

Tenga en cuenta que este es un código totalmente interno para mi biblioteca, por lo que si bien sé que distribuir estructuras de datos internas como esa es una mala idea en general, si puedo hacerlo de forma segura con estas clases, lo haré.

¿Fue útil?

Solución

Como dice Kent, + = se utiliza para Delegate.Combine , y - = usa Delegate.Remove . Consulte mi eventos / delegados artículo para obtener más información.

Lo importante es que los delegados son inmutables: llamar a Combinar / Eliminar no cambia en absoluto al delegado al que lo llama, por lo que no necesita clonar nada. Lo mismo es cierto para cualquier otra cosa que haga con el delegado: si obtiene la lista de invocación y cambia el contenido de la matriz devuelta, por ejemplo, eso no cambiará lo que el delegado realmente hace.

(Esto es exactamente como el comportamiento de String, si quieres otra forma de pensarlo).

Otros consejos

+ = es equivalente a Delegate.Combine () . - = es equivalente a Delegate.Remove () . Cada uno crea una nueva instancia de Delegate y la devuelve.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top