InicioArticulos y noticiasBases de datosProgramaciónForosInternetServiciosContratacionEmail
Tutorial C#
Introduccion a C#
Programacion con C#
Fundamentos de C#
Operadores
Instrucciones
Estrcuturas de control.
Definición de clases
Creación de objetos
Herencia y métodos virtuales
Polimorfismo
Ocultación de miembros
Miembros de tipo
Encapsulación
Espacios de nombres
Importación de espacios de nombres
Espacio de nombres distribuidos
Variables y tipos de datos
Tablas unidimensionales
Tablas multidimensionales
La clase System.Array
Cadenas de texto
Constantes
Orden de inicialización de variables
Métodos
Métodos externos
Constructores
Destructores
Propiedades
Indizadores
Redefinición de operadores
Delegados y eventos
La clase MulticastDelegate
Llamadas asíncronas
Implementación interna de los delegados
Eventos
Estructuras
Boxing y unboxing
Constructores de estructuras
Enumeraciones
Interfaces
Excepciones
Otras instrucciones
Atributos
Definición de nuevos atributos
Lectura de atributos en tiempo de ejecución
Atributos de compilación
Pseudoatributos
Código inseguro
Definición de punteros
Manipulación de punteros
Operadores relacionados con código inseguro
Fijación de variables apuntadas
Novedades de C# 2.0
Genéricos
Tipos parciales
Iteradores
Mejoras en la manipulación de delegados
Tipos anulables
Modificadores de visibilidad de bloques get y set
Clases estáticas
Referencias a espacios de nombres
Supresión temporal de avisos
Atributos condicionales
Incrustación de tablas en estructuras
Modificaciones en el compilador
También puedes ver ...
SubVersion y Visual Studio
Encriptación con AES Rijndael - Ejemplo
TripleDES - Un ejemplo practico en C#
Insertar una marca de agua en documentos PDF
Serialización: XmlSerializer y BinaryFormater
Handler para manipular imagenes
Conversiones de tipos personalizadas (VB y C#)
Compresión por gzip y deflate
La página Web que está abriendo contiene tanto elementos seguros como no seguros.
Cómo insertar un fichero .xml en un campo de tipo XML de SQL server 2005 o 2008


Eventos

Concepto de evento

    Un evento es una variante de las propiedades para los campos cuyos tipos sean delegados. Es decir, permiten controlar la forman en que se accede a los campos delegados y dan la posibilidad de asociar código a ejecutar cada vez que se añada o elimine un método de un campo delegado.

Sintaxis básica de definición de eventos

    La sintaxis básica de definición de un evento consiste en definirlo como cualquier otro campo con la única peculiaridad de que se le ha de anteponer la palabra reservada event al nombre de su tipo (que será un delegado) O sea, se sigue la sintaxis:


<modificadores> event <tipoDelegado> <nombreEvento>;

    Por ejemplo, para definir un evento de nombre Prueba y tipo delegado D se haría:


public event D Prueba;

    También pueden definirse múltiples eventos en una misma línea separando sus nombres mediante comas. Por ejemplo:


public event
D Prueba1, Prueba2;

    Desde código ubicado dentro del mismo tipo de dato donde se haya definido el evento se puede usar el evento tal y como si de un campo delegado normal se tratase. Sin embargo, desde código ubicado externamente se imponen una serie de restricciones que permiten controlar la forma en que se accede al mismo:

  • No se le puede aplicar los métodos heredados de System.MulticastDelegate.

  • Sólo se le puede aplicar dos operaciones: añadido de métodos con += y eliminación de métodos con -=. De este modo se evita que se use sin querer = en vez de += ó -= y se sustituyan todos los métodos de la lista de métodos del campo delegado por otro que en realidad se le quería añadir o quitar (si ese otro valiese null, ello incluso podría provocar una System.NullReferenceException)

  • No es posible llamar a los métodos almacenados en un campo delegado a través del mismo. Esto permite controlar la forma en que se les llama, ya que obliga a que la llamada tenga que hacerse a través de algún método público definido en la definición del tipo de dato donde el evento fue definido.

Sintaxis completa de definición de eventos

La verdadera utilidad de un evento es que permite controlar la forma en que se asocian y quitan métodos de los objetos delegados con += y -=. Para ello se han de definir con la siguiente sintaxis avanzada:


<modificadores> event <tipoDelegado> <nombreEvento>
{
 add
 {
  <códigoAdd>
 }
 
 remove
 {
  <códigoRemove>
 }
}

    Con esta sintaxis no pueden definirse varios eventos en una misma línea como ocurría con la básica. Su significado es el siguiente: cuando se asocie un método con +=  al evento se ejecutará el <códigoAdd>, y cuando se le quite alguno con –= se ejecutará el <códigoRemove>. Esta sintaxis es similar a la de los bloques set/get de las propiedades pero con una importante diferencia: aunque pueden  permutarse las secciones add y remove, es obligatorio incluir siempre a ambas.

    La sintaxis básica es en realidad una forma abreviada de usar la avanzada. Así, la definición public event D Prueba(int valor); la interpretaría el compilador como:


private D prueba
public event D  Prueba
{
 [MethodImpl(MethodImlOptions.Synchronized)]
 add
 {
  prueba = (D) Delegate.Combine(prueba, value);
 }
 [MethodImpl(MethodImlOptions.Synchronized)]   
 remove
 {
  prueba = (D) Delegate.Remove(prueba, value);
 }
}

    Es decir, el compilador definirá un campo delegado privado y códigos para add y remove que hagan que el uso de += y -= sobre el evento tenga el efecto que normalmente tendrían si se aplicasen directamente sobre el campo privado. Como se ve, dentro de estos métodos se puede usar value para hacer referencia al operando derecho de los operadores += y -=. El atributo System.Runtime.InteropServices.MethodImpl que precede a los bloques add y remove sólo se incluye para asegurar que un cambio de hilo no pueda interrumpir la ejecución de sus códigos asociados.

    Las restricciones de uso de eventos desde códigos externos al tipo donde se han definido se deben a que en realidad éstos no son objetos delegados sino que el objeto delegado es el campo privado que internamente define el compilador. El compilador traduce toda llamada al evento en una llamada al campo delegado. Como este es privado, por eso sólo pueda accederse a él desde código de su propio tipo de dato.

    En realidad, el compilador internamente traduce las secciones add y remove de la definición de un evento en métodos de la forma:


void add_<nombreEvento>(<tipoDelegado> value)
void remove_<nombreEvento>(<tipoDelegado> value) 

    Toda aplicación de += y -= a un evento no es convertida en una llamada al campo privado sino en una llamada al método add/remove apropiado, como se puede observar analizando el MSIL de cualquier fuente donde se usen += y -= sobre eventos. Además, como estos métodos devuelven void ése será el tipo del valor devuelto al aplicar += ó -= (y no el objeto asignado), lo que evitará que código externo al tipo donde se haya definido el evento pueda acceder directamente al campo delegado privado.

    Si en vez de la sintaxis básica usamos la completa no se definirá automáticamente un campo delegado por cada evento que se defina, por lo que tampoco será posible hacer referencia al mismo desde código ubicado en la misma clase donde se ha definido. Sin embargo ello permite que el programador pueda determinar, a través de secciones add y remove, cómo se almacenarán los métodos. Por ejemplo, para ahorrar memoria se puede optar por usar un diccionario donde almacenar los métodos asociados a varios eventos de un mismo objeto en lugar de usar un objeto delegado por cada uno.

    Dado que las secciones add y remove se traducen como métodos, los eventos también podrán participar en el mecanismo de herencia y redefiniciones típico de los métodos. Es decir, en <modificadores> aparte de modificadores de acceso y el modificador static, también se podrán incluir los modificadores relativos a herencia. En este sentido hay que precisar algo: un evento definido como abstract ha de definirse siempre con la sintaxis básica (no incluirá secciones add o remove)


Inicio | Tutorial C# Implementación interna de los delegadosTutorial C#Estructuras Versión para imprimir Foros de consulta

 
la manga por duhtmn
Respuesta recibida el [09/10/2007 11:03:51]
los formularios se utilizan para reacer formularios

 
djk... por Anónimo
Respuesta recibida el [09/07/2008 07:50:07]
djk

 
reHacer compañero!... por Anónimo
Respuesta recibida el [09/07/2008 07:52:02]
reHacer compañero!

 
se mas especifico... por herik marquez
Respuesta recibida el [01/03/2009 10:22:22]
se mas especifico

 
No se entiende ni madres por CHOLO
Respuesta recibida el [24/07/2009 11:30:12]
No se le entiende ni madres explicate bien no hagas pendejadas que no entendamos

 
Es sintaxis general por Donmasimo
Respuesta recibida el [23/08/2009 10:51:16]
Esto es sintaxis general!!! un simple programador sin experiencia no entiende, se usa notacion de la gramatica del lenguaje... asi que hay que ver a quien va enfocado esto...

 
que mariquera por catalina diaz
Respuesta recibida el [08/10/2009 11:36:23]
lo que estoy buscando no lo encuentro pongase serio...pendejo!!

 
Para Cholo por Inquisidor
Respuesta recibida el [30/10/2009 09:10:10]
Chinga tu madre Cholo, yo si le entendi

 
KeyPress por Monica
Respuesta recibida el [16/02/2010 01:32:36]
Quisiera saber como utilizar Keypress, keydown y keyup... Gracias!


Añadir comentario ... Para preguntar utiliza los foros
Autor:

Título:


Para preguntar utiliza los foros.



Inicio | Tutorial C# Implementación interna de los delegadosTutorial C#Estructuras Versión para imprimir

Eventos
Autor: José Antonio González Seco
Visitas: 33899 Fecha de publicación: 27/10/2006
José Antonio es experto en tecnologias Microsoft. Imparte cursos y conferencias en congresos sobre C# y .NET en Universidades de toda España (Sevilla, Barcelona, San Sebastián, Valencia, Oviedo, etc.) en representación de grandes empresas como Microsoft.




Visitas: 81 | Comentarios: 2 | Archivo: Articulos
02/02/2010 iPad vs Telesketch
Visitas: 786 | Comentarios: 2 | Archivo: Articulos
Categorias: Humor
Visitas: 725 | Comentarios: 3 | Archivo: Articulos
Visitas: 3116 | Comentarios: 2 | Archivo: Articulos
Categorias: C#
Visitas: 14470 | Comentarios: 7 | Archivo: Articulos
Categorias: C#|Seguridad
Visitas: 1462 | Comentarios: 3 | Archivo: Articulos
Visitas: 688 | Comentarios: 2 | Archivo: Articulos
Visitas: 367 | Comentarios: 0 | Archivo: Articulos
Visitas: 1983 | Comentarios: 2 | Archivo: Articulos
Categorias: C#

Útimos temas recibidos en los foros ...
certificado de afiliación de pensiones y cesantias por secre ... [Actualidad] 107 28/01/2010
Certificadoo por Francy ... [Actualidad] 0 10/03/2010
FORMULARIO ACCESS por jcifuentes ... [Access] 34 29/05/2007
certificado de pensiones del bbva horizonte por danger ... [Actualidad] 119 12/01/2010
Certificado por Francy ... [Actualidad] 0 10/03/2010
certificado de pensión y ses antias por hernan ... [Actualidad] 0 10/03/2010
Certificado de Penciones Horizonte por orlandossa ... [Actualidad] 4 09/02/2010
fondo de pensiones por mafe ... [Access] 0 10/03/2010
certificado del fondo de pensiones cc 10.491.465 santander de Q. por carlos andres cifuentes banguero ... [Actualidad] 9 17/02/2010
certificado de semanas cotisadaz por lis ... [Actualidad] 0 10/03/2010
certificado por arme ... [Actualidad] 0 10/03/2010
Quiero saber a que fondo de pensiones estoy afiliada por clau ... [Actualidad] 169 24/07/2009

Access CGI JSP ORACLE UNIX
Actualidad HTML/DHTML/XHTML LINUX PHP Visual Basic .NET
ASP ISAPI MS DOS Power Builder Visual Basic 6.0
ASP.NET Java mySQL SQL WIN 98/NT/2000/XP
C# JavaScript Opinion SQL Server

devjoker  Te recomendamos además ...
10/06/2007 Multiples escritorios en Windows XP
02/09/2007 Procedimientos almacenados en Transact SQL    forma parte de...Tutorial de Transact SQL
22/10/2005 El lenguaje SQL    forma parte de...Tutorial SQL
21/07/2006 Funciones integradas de PL/SQL    forma parte de...Tutorial PL/SQL
26/03/2009 Manejador de archivos .js y .css para compresión y caché
22/10/2005 Introducción SQL    forma parte de...Tutorial SQL
28/08/2006 Ubuntu en VmWare con VMware Tools
17/10/2006 Excepciones personalizadas en PL/SQL    forma parte de...Tutorial PL/SQL
22/10/2005 Insertar datos. INSERT    forma parte de...Tutorial SQL
22/10/2005 Consultar datos. SELECT    forma parte de...Tutorial SQL

 

Encuesta
¿A que perfil te adaptas mejor?




[Ver] [Votar]