Equivalencias VB / C# |
Equivalencias entre Visual Basic y Visual C# (4)Publicado el 30/Dic/2006
|
Estas son las equivalencias publicadas en esta página: En esta ocasión será sobre cómo definir, lanzar e interceptar eventos.
1- Definir eventosLos eventos en Visual Basic se pueden definir de dos formas distintas,
según usemos delegados o no. Los parámetros indicados en estos ejemplos son dos, uno de
tipo cadena y otro de tipo entero, pero en los eventos podemos definir
cualquier cantidad de parámetros y estos pueden ser de cualquier tipo,
además de que pueden ser por valor o por referencia.
Definir eventos en Visual Basic sin usar delegados(al estilo de como se hace en todas las versiones de Visual Basic, incluso las que no son de .NET) Public Event MiEvento(ByVal param1 As String, ByVal param2 As Integer)
Nota:
Definir eventos en Visual Basic usando delegadosPrimero debemos definir el delegado (que debe tener un ámbito igual o
superior que el evento). Public Delegate Sub MiEventoEventHandler(ByVal param1 As String, ByVal param2 As Integer) Después definimos el evento pero indicando que se usará el delegado, es decir, lo definimos como si fuera una variable con el mismo tipo que el delegado: Public Event MiEvento As MiEventoEventHandler
Nota:
Definir eventos en Visual C# (siempre usando delegados)El delegado lo definimos de la siguiente forma: public delegate void MiEventoEventHandler(string param1, int param2); Y el evento lo definimos del tipo del delegado: public event MiEventoEventHandler MiEvento;
Nota:
2- Lanzar eventosPara lanzar un evento (hacer que se produzca), siempre lo tendremos que
hacer desde la propia clase, aunque si definimos un método que sea el
encargado de producir dicho evento, (que es como se recomienda en la
documentación de Visual Studio), podremos lanzarlo desde cualquier sitio
desde el que se tenga acceso a ese método. Lanzar un evento en Visual Basic:La forma de lanzar un evento en Visual Basic, se hace siempre de la misma
forma, lo hayamos definido con un delegado o sin el delegado. Public Sub Mostrar(ByVal nombre As String, ByVal edad As Integer) RaiseEvent MiEvento(nombre, edad) ' ... resto del código ... End Sub
En este caso, lo lanzamos desde un método que recibe los parámetros que vamos a usar en el evento, pero la instrucción RaiseEvent la podemos usar en cualquier otro método o propiedad de nuestra clase. Nota:
Lanzar un evento en C#:En C#, la forma de lanzar un evento es como cuando usamos cualquier delegado, pero antes de lanzarlo (o llamar al delegado), debemos comprobar si en realidad se está usando en algún lado ese evento, por tanto debemos comprobar si la variable del evento es un valor nulo o no, en caso de que no sea un valor nulo, es que lo podemos lanzar. public void Mostrar(string nombre, int edad) { // En C# debemos comprobar que el evento no sea null if (MiEvento != null) { // El evento se lanza como cualquier delegado MiEvento(nombre, edad); } // ... resto del código ... }
3- Interceptar eventosPara interceptar un evento debemos definir un método que tenga la misma
"firma" que el delegado asociado a ese evento, es decir, debe ser del mismo
tipo y tener los mismos parámetros. Una vez que tenemos el método definido, lo debemos "ligar" con el evento. En Visual Basic, esa "ligadura" podemos hacerla de dos formas,
dependiendo de cómo hayamos definido la variable de la clase que define el
evento.
Ligar un método de evento en Visual Basic usando WithEvents y HandlesEn Visual Basic, la forma más fácil de usar las variables que definen eventos es declarándola con WithEvents, de esa forma podemos usar la instrucción Handles para ligar el método con el evento, además de que podemos usar el propio editor de Visual Basic para crear automáticamente el método que recibirá la notificación de que el evento se ha producido. En el siguiente código tenemos la definición de la clase usando WithEvents y la definición del método usando la cláusula Handles seguida de la variable y el evento que queremos asociar con ese método: ' De esta forma podemos definir el método usando Handles WithEvents prueba As New MiClase1 ' Si la variable está definida con WithEvents ' podemos usar Handles para ligar el método con el evento Private Sub prueba_MiEvento( _ ByVal param1 As String, ByVal param2 As Integer) _ Handles prueba.MiEvento Console.WriteLine( _ "Se produce el evento MiEvento con los parámetros: {0} y {1}", param1, param2) End Sub
Nota:
Ligar un método de evento en Visual Basic usando AddHandlerLa otra forma de ligar un método de evento en Visual Basic es definiendo
la variable de forma normal (sin WithEvents) y asociando ese método con el
evento por medio de AddHanlder. En el siguiente código vemos cómo usar la instrucción AddHandler, en el primer parámetro indicamos la variable y el evento que queremos interceptar y en el segundo debemos indicar el método que recibirá la notificación, en ese segundo parámetro siempre debemos usar AddressOf antes del nombre del método. Sub UsarMiClase1() ' Definiendo la clase de esta forma Dim prueba As New MiClase1 ' tenemos que ligar el evento con AddHandler AddHandler prueba.MiEvento, AddressOf prueba_MiEvento prueba.Mostrar("Guille", 49) End Sub Private Sub prueba_MiEvento( _ ByVal param1 As String, ByVal param2 As Integer) Console.WriteLine( _ "Se produce el evento MiEvento con los parámetros: {0} y {1}", param1, param2) End Sub
Nota:
Ligar un método de evento en C#En C# podemos ligar un método de evento con el evento adecuado usando el operador +=. Dependiendo de que estemos usando la versión 2.0 (o superior) de C# u otra anterior, la forma de indicar el método que recibirá el evento se simplifica. En la forma "larga" (válida para cualquier versión de C#), después del operador += debemos indicar un constructor con el tipo de delegado adecuado al que le pasaremos el método que queramos usar para interceptar dicho evento. En la versión "corta" (válida para C# 2.0 -Visual C# 2005- o superior) no es necesario indicar el delegado, solo el nombre del método. En cualquier caso, el método debe tener la misma firma que el delegado, es decir, debe ser del mismo tipo (normalmente void) y debe tener los mismos parámetros. Si estamos usando Visual C# 2005 (o superior) el propio editor nos permite crear automáticamente dicho método. Veamos las dos formas de ligar el evento con el método: Usando la versión larga, válida para cualquier versión de C#public static void UsarMiClase1() { MiClase1 prueba = new MiClase1(); prueba.MiEvento += new MiEventoEventHandler(prueba_MiEvento); prueba.Mostrar("Guille", 49); } static private void prueba_MiEvento(string param1, int param2) { Console.WriteLine( "Se produce el evento MiEvento con los parámetros: {0} y {1}", param1, param2); }
Usando la versión corta, válida para C# 2.0 (2005) o superiorpublic static void UsarMiClase1() { MiClase1 prueba = new MiClase1(); // En C# 2.0 o superior no es necesario usar el delegado // para ligar el método con el evento prueba.MiEvento += prueba_MiEvento; prueba.Mostrar("el Guille", 49); } static private void prueba_MiEvento(string param1, int param2) { Console.WriteLine( "Se produce el evento MiEvento con los parámetros: {0} y {1}", param1, param2); }
Recordarte que el primer ejemplo será válido para cualquier versión de C#, mientras que el segundo solo será válido para C# 2.0 o superior, y recordarte también que C# 2.0 es lo mismo que Visual C# 2005.
Desligar un método de un eventoSi queremos desligar un método de un evento (para que ese evento ya no se siga interceptando), podemos hacerlo de la siguiente forma: En C# usaremos el operador -= de la misma forma que usamos el operador +=, pero en este caso, lo que hace es que el método que esté después de ese operador se desligue del evento. En Visual Basic usaremos la instrucción RemoveHandler, esta instrucción se usa de la misma forma que AddHandler, es decir, primero indicamos el evento que queremos desligar y después indicaremos el método que queremos que ya no se use para recibir dicho evento, como bien supones, el método debe ir precedido de la instrucción AddressOf.
Nota:
|