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 ...
Creando cadenas de conexión ConnectionStrings en .net 3.5 o visual Studio 2008 usando SqlConnectionStringBuilder
Migración de WSE a WCF (Web Services de 2005 a 2008)
Generar archivos PDF con C#
TransactionScope - Simplificando el trabajo con transacciones.
LinQ To SQL - Un ejemplo sencillo
Cómo activar Intelisense (autocompletado) en el Web.config
Leer un campo XML de SQL Server 2005 con C#
TripleDES - Un ejemplo practico en C#
Mostrar un GridView dentro de un DataList
String.Format

Afiliados
La Web del programador
MundoProgramacion


 

Implementación interna de los delegados

    Cuando hacemos una definición de delegado de la forma:


<modificadores> delegate <tipoRetorno> <nombre>(<parámetros>);

    El compilador internamente la transforma en una definición de clase de la forma:


 <modificadores> class <nombre>:System.MulticastDelegate
 {
  private object _target;
  private int _methodPtr;
  private MulticastDelegate _prev;
  
  public <nombre>(object objetivo, int punteroMétodo)
  {...}
  
  public virtual <tipoRetorno> Invoke(<parámetros>)
  {...}
  
  public virtual IAsyncResult BeginInvoke(<parámetros>,
AsyncCallback cb,  Object o)
  {...}
  
  public virtual <tipoRetorno> EndInvoke(<parámetrosRefOut>,
IASyncResult ar)
  {...}
 }

    Lo primero que llama la atención al leer la definición de esta clase es que su constructor no se parece en absoluto al que hemos estado usando hasta ahora para crear objetos delegado. Esto se debe a que en realidad, a partir de los datos especificados en la forma de usar el constructor que el programador utiliza, el compilador es capaz de determinar los valores apropiados para los parámetros del verdadero constructor, que son:

  • object objetivo contiene el objeto al cual pertenece el método especificado, y su valor se guarda en el campo _target. Si es un método estático almacena null.

  • int punteroMétodo contiene un entero que permite al compilador determinar cuál es el método del objeto al que se desea llamar, y su valor se guarda en el campo _methodPtr. Según donde se haya definido dicho método, el valor de este parámetro procederá de las tablas MethodDef o MethodRef de los metadatos.

    El campo privado _prev de un delegado almacena una referencia al delegado previo al mismo en la cadena de métodos. En realidad, en un objeto delegado con múltiples métodos lo que se tiene es una cadena de objetos delegados cada uno de los cuales contiene uno de los métodos y una referencia (en _prev) a otro objeto delegado que contendrá otro de los métodos de la cadena.

    Cuando se crea un objeto delegado con new se da el valor null a su campo _prev para así indicar que no pertenece a una cadena sino que sólo contiene un método. Cuando se combinen dos objetos delegados (con + o Delegate.Combine()) el campo _prev del nuevo objeto delegado creado enlazará a los dos originales; y cuando se eliminen métodos de la cadena (con o Delegate.Remove()) se actualizarán los campos _prev de la cadena para que salten a los objetos delegados que contenían los métodos eliminados.

    Cuando se solicita la ejecución de los métodos almacenados en un delegado de manera asíncrona lo que se hace es llamar al método Invoke() del mismo. Por ejemplo, una llamada como esta:


objDelegado(49);

    Es convertida por el compilador en:


objDelegado.Invoke(49);

    Aunque Invoke() es un método público, C# no permite que el programador lo llame explícitamente. Sin embargo, otros lenguajes gestionados sí que podrían permitirlo.

    El método Invoke() se sirve de la información almacenada en _target, _methodPtr y _prev, para determinar a cuál método se ha de llamar y en qué orden se le ha de llamar. Así, la implementación de Invoke() será de la forma:


public virtual <tipoRetorno> Invoke(<parámetros>)
{
 if (_prev!=null)
  _prev.Invoke(<parámetros>);                      
 return _target._methodPtr(<parámetros>);
}

 Obviamente la sintaxis _target._methodPtr no es válida en C#, ya que _methodPtr no es un método sino un campo. Sin embargo, se ha escrito así para poner de manifiesto que lo que el compilador hace es generar el código apropiado para llamar al método perteneciente al objeto indicado en _target e identificado con el valor de _methodPtr

    Nótese que la instrucción if incluida se usa para asegurar que las llamadas a los métodos de la cadena se hagan en orden: si el objeto delegado no es el último de la cadena. (_prev!=null) se llamará antes al método Invoke() de su predecesor.

    Por último, sólo señalar que, como es lógico, en caso de que los métodos que el objeto delegado pueda almacenar no tengan valor de retorno (éste sea void), el cuerpo de Invoke() sólo varía en que la palabra reservada return es eliminada del mismo.


Inicio | Tutorial C# Llamadas asíncronasTutorial C#Eventos Versión para imprimir Foros de consulta


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

Título:


Para preguntar utiliza los foros.



Inicio | Tutorial C# Llamadas asíncronasTutorial C#Eventos Versión para imprimir

Implementación interna de los delegados
Autor: José Antonio González Seco
Visitas: 5557 Fecha de publicación: 25/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: 28 | Comentarios: 0 | Archivo: Articulos
Categorias: Transact-SQL|LinQ
Visitas: 442 | Comentarios: 0 | Archivo: Articulos
Categorias: Visual Basic .NET|C#|ASP.NET|ASP.NET|Programación|ADO.NET
27/09/2008 Navegando ....
Visitas: 107 | Comentarios: 0 | Archivo: Articulos
Categorias: Humor
Visitas: 244 | Comentarios: 0 | Archivo: Articulos
Categorias: Visual Basic .NET|C#|ASP.NET|ASP.NET|Programación|WCF
Visitas: 1107 | Comentarios: 0 | Archivo: Articulos
Categorias: C#
Visitas: 245 | Comentarios: 0 | Archivo: Articulos
Categorias: JavaScript|ASP.NET
Visitas: 727 | Comentarios: 0 | Archivo: Articulos
Categorias: Windows XP|Linux|Windows Vista
Visitas: 493 | Comentarios: 0 | Archivo: Articulos
Categorias: Linux|BSD
Visitas: 257 | Comentarios: 0 | Archivo: Articulos
Categorias: Programación|Actualidad
18/08/2008 SQL Server 2008
Visitas: 1237 | Comentarios: 1 | Archivo: Articulos
Categorias: Transact-SQL

Útimos temas recibidos en los foros ...
tutorial por Maria ... [SQL] 1 15/10/2008
autogenerado essalud codigo por tavo1970 ... [Visual Basic .NET] 26 27/12/2006
Hacer un programa de una nave en JAVA por Pablo ... [Java] 1 19/09/2008
ing. de sistemas por jihur ... [ORACLE] 0 15/10/2008
varchar2(1) vs varchar(1) por edu ... [ORACLE] 0 15/10/2008
variable escalar por peyin ... [Visual Basic .NET] 0 15/10/2008
necesito a por la rubia ... [Actualidad] 2 14/10/2008
descargar tutorial C# por afmp ... [C#] 1 14/10/2008
Conexion a BD por Maurito22 ... [Visual Basic .NET] 4 19/06/2007
insertar un tipo LONG en tabla por angustias ... [ORACLE] 4 14/10/2008
Recuperar contraseña automatica de un usario por jhors ... [ASP.NET] 0 15/10/2008
Problema Eventos del Mouse por Miguel ... [C#] 2 20/10/2007

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 ...
22/10/2005 Indices    forma parte de...Tutorial SQL
24/05/2006 Cursores Explicitos en PL/SQL    forma parte de...Tutorial PL/SQL
01/01/2005 Conceptos básicos.    forma parte de...Iniciación a las bases de datos
16/11/2005 Delegados en C#
10/10/2006 Como conectar a ORACLE con Java
23/05/2006 Cursores en PL/SQL    forma parte de...Tutorial PL/SQL
22/10/2005 Actualización de datos. UPDATE    forma parte de...Tutorial SQL
24/05/2006 Cursores Implicitos en PL/SQL    forma parte de...Tutorial PL/SQL
22/10/2005 Insertar datos. INSERT    forma parte de...Tutorial SQL
22/10/2005 El lenguaje SQL    forma parte de...Tutorial SQL

 

Encuesta
¿A que perfil te adaptas mejor?
[Ver] [Votar]