Todo lo que se puede hacer con los delegados se puede hacer sin ellos, pero los delegados proporcionan una forma mucho más limpia de hacerlas. Si no hubiera delegados, habría que definir una interfaz o clase base abstracta para cada posible firma de función que contenga una función Invocar (parámetros apropiados) y definir una clase para cada función que fuera elegible por los pseudodelegados. Esa clase heredará la interfaz apropiada para la firma de la función, contendrá una referencia a la clase que contiene la función que supuestamente representa, y un método que implementará Invoke (parámetros apropiados) que llamaría a la función apropiada en la clase a la que pertenece. una referencia. Si la clase Foo tiene dos métodos, Foo1 y Foo2, ambos tomando un único parámetro, ambos pueden ser llamados por pseudodelegados, se crearían dos clases adicionales, una para cada método.
Sin el soporte del compilador para esta técnica, el código fuente debería ser bastante atroz. Sin embargo, si el compilador pudiera autogenerar las clases anidadas correctamente, las cosas podrían estar bastante limpias. La velocidad de despacho para los pseudodelegados probablemente sea generalmente más lenta que con los delegados convencionales, pero si los pseudodelegados fueran una interfaz en lugar de una clase base abstracta, una clase que solo necesita hacer un pseudo delegado para un método de una firma determinada podría implementar la propia interfaz de pseudo delegado; la instancia de la clase podría pasar a cualquier código esperando un pseudo delegado de esa firma, evitando la necesidad de crear un objeto adicional. Además, si bien el número de clases que uno necesitaría al usar pseudo delegados sería mayor que cuando se usan delegados "reales", cada pseudo delegado solo necesitaría tener una sola instancia de objeto.
Por cierto, los delegados son inmutables! –
Lo siento, quise decir inmutable – InfoLearner
edited =) ......... – Singleton