C# (II): Delegates

El concepto de “delegate” proviene de una técnica que existe hace largo tiempo conocida comúnmente como “Callback funtions” o “Function pointers” y se trata de un puntero a una llamada a una función.

.NET implementa está técnica a través de los delegates, con la diferencia de que, en C por ejemplo, se trata de un puntero a un lugar de la memoria, sin ninguna idea de que se está apuntando realmente. Sin embargo, un delegado es una operación segura (type safe), ya que es necesario envolver los detalles del método en ese nuevo tipo de objeto (el delegado). Es necesario especificar una definición precisa del tipo a devolver y de los parámetros. Asimismo, se pueden aplicar los comunes modificadores de acceso a la definición (public, private, protected).
Una vez que se defina que tipo de método el delegado representará, será posible crear una o varias instancias de ese delegado. Realmente, lo que el compilador hace es crear una clase que represente al delegado. Esta clase, siempre posee un constructor de un parámetro, siendo éste el método al que el delegado se referirá.

Un ejemplo de definición sería: delegate double DosLongs(long first, long second);

En cualquier código, dando el nombre de una instancia del delegado seguido de un/os parámetro/s entre paréntesis tiene el mismo efecto que llamar al método “envuelto” por el delegado. De hecho, suministrar los paréntesis a la instancia del delegado es lo mismo que invocar el método Invoke de la clase del delegado. “Delegate inference” es la forma de escribir la instancia del delegado simplemente pasando el nombre de la dirección.

Una instancia de un delegado se puede referir a cualquier instancia o método estático de cualquier tipo de objeto, siempre y cuando la declaración del método coincida con la declaración del delegado. Es posible para un delegado envolver más de un método; es lo que se llama “multicast delegate”. Si es llamado llamará sucesivamente en orden a cada método. De la misma manera, reconoce los operadores + , += , – , – =.

Una cuestión a tener en cuenta con un multicast delegate es que el orden en el cual los métodos se encadenan es desconocido de antemano, y por tanto, no es conveniente apoyarse que se invoque a los métodos en un determinado orden; si uno de los métodos dispara una excepción se produce una parada de la iteración. Se puede evitar este problema mediante el método de la clase Delegate GetInvocationList() que devuelve un array de objetos delegate.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: