Colección de citas famosas - Slogan de motivación - ¿Cuál es el papel de la delegación en C#?

¿Cuál es el papel de la delegación en C#?

Un delegado es un tipo en C#, que en realidad es una clase que puede contener una referencia a un método.

A diferencia de otras clases, una clase delegada puede tener una firma y solo puede contener referencias a métodos que coincidan con su firma.

Una declaración de delegado define un tipo de referencia que se puede utilizar para encapsular un método con una firma específica. Las instancias delegadas encapsulan métodos estáticos o métodos de instancia. Los delegados son más o menos similares a los punteros de función en C; sin embargo, los delegados son seguros para escribir. La definición anterior explica que la declaración de delegado define un tipo de referencia que se utiliza para comprimir la forma de método especificada. Las instancias delegadas comprimen métodos estáticos o métodos de instancia. Los delegados y los punteros de función en C son muy similares. Sin embargo, la diferencia es que los delegados son seguros y tienen seguridad de escritura.

Encontrado en el sitio web de codeProject.

El delegado de C# es una función de devolución de llamada. En otras palabras, la delegación es una forma de proporcionar retroalimentación desde un servidor de clase a un cliente de clase.

El delegado de C# es una función de devolución de llamada. En otras palabras, la delegación es una forma de proporcionar retroalimentación desde el lado del servidor de una clase al lado del cliente de la clase. El delegado de C# es más inteligente que las devoluciones de llamada "estándar" porque le permite definir una lista estricta de parámetros que se pasan del servidor de clase al cliente de clase

Pero el delegado de C# es más inteligente que una función de devolución de llamada normal . Porque permite definir listas estrictas de parámetros. Esta lista de parámetros contiene los parámetros pasados ​​desde el servidor de la clase al cliente de la clase. El tipo de delegado de C#

Delegate es un puntero de función, pero en comparación con los punteros de función ordinarios, existen tres diferencias principales: 1) Un objeto delegado puede transportar múltiples métodos a la vez en lugar de uno a la vez. Cuando llamamos a un delegado que tiene varios métodos cargados, todos los métodos se llaman en el orden en que se cargaron en el objeto delegado; veremos cómo hacerlo más adelante. 2) No es necesario que los métodos transportados por el objeto delegado pertenezcan a la misma categoría. Todos los métodos transportados por un objeto delegado deben tener el mismo prototipo y forma. Sin embargo, estos métodos pueden ser estáticos y no estáticos y pueden constar de uno o más miembros de diferentes clases. 3) La declaración de un tipo de delegado esencialmente crea una nueva instancia de subtipo de la que se deriva. NET marco de la biblioteca. Proporcionan un conjunto de métodos públicos para consultar el objeto delegado o los métodos que contiene.

-

La función que implementa es muy similar al puntero de función en C/C.

Permite pasar un método M de la clase A a otro objeto de la clase B, de modo que el objeto de la clase B pueda llamar a este método M..

Pero a diferencia de los punteros a funciones En comparación con delegado, delegado tiene muchas ventajas que los punteros de función no tienen. En primer lugar, los punteros de función solo pueden apuntar a funciones estáticas, mientras que los delegados pueden referirse tanto a funciones estáticas como a funciones miembro no estáticas.

Al hacer referencia a una función miembro no estática, el delegado no solo guarda una referencia al puntero de entrada de la función, sino que también guarda una referencia a la instancia de clase que llama a la función. En segundo lugar, en comparación con los punteros de función, los delegados son objetos administrados confiables, seguros y orientados a objetos.

En otras palabras, el tiempo de ejecución puede garantizar que el delegado apunte a un método válido y usted no tiene que preocuparse de que el delegado apunte a una dirección no válida o fuera de los límites.

Implementar la delegación es muy sencillo. Esto se puede lograr mediante los siguientes tres pasos: 1. Declare un objeto delegado que debe tener el mismo parámetro y tipo de valor de retorno que el método que se pasa.

2. Cree un objeto delegado y pase la función que se pasará como parámetro.

3. Llame al método a través del objeto creado en el paso anterior e implemente llamadas asincrónicas en este objeto. Utilice el sistema;

Clase pública MyDelegateTest

{

//Paso 1, declare el objeto delegado.

Delegado público void MyDelegate(string name);

//Este es el método que queremos pasar, sus parámetros y tipos de valor de retorno son los mismos que MyDelegate.

Vacío estático público MyDelegateFunc(nombre de cadena)

{

Consola. WriteLine("Hola", nombre);

}

Public static void Main()

{

//Segundo paso 1 : crea un objeto delegado.

MyDelegate md = new MyDelegate(MyDelegateTest.MyDelegateFunc);

// El tercer paso, llamar al delegado.

MD(" Sam 1111 ");

}

}El resultado de salida es: Hola, Sam 1111.

Ahora que entendemos la delegación, echemos un vistazo a cómo C# maneja los eventos. El procesamiento de eventos en C# es en realidad un delegado con una firma especial, como esta: delegado público anula mi controlador de eventos (remitente del objeto, mi eventorgse). Los dos parámetros del remitente representan el remitente del evento y e es la clase de parámetro del evento. La clase MyEventArgs se utiliza para contener datos relacionados con eventos y todas las clases de parámetros de eventos deben derivarse del sistema. Clase EventArgs. Por supuesto, si tu evento no contiene parámetros, puedes utilizar el sistema directamente. Clase EventArgs como parámetros. Es así de simple. Combinado con la implementación de delegado, podemos resumir la implementación de eventos personalizados en los siguientes pasos: 1. Defina el tipo de objeto delegado, que tiene dos parámetros. El primer parámetro es el objeto emisor del evento y el segundo parámetro es el objeto de clase del parámetro del evento.

2. Defina la clase de parámetro del evento, que debe derivarse del sistema. Clase EventArgs. Si el evento no tiene parámetros, puede omitir este paso.

3. Defina el método de manejo de eventos, que debe tener los mismos tipos de parámetros y valores de retorno que el objeto delegado.

4. Utilice la palabra clave event para definir el objeto del evento, que también es un objeto delegado.

5. Utilice el operador = para agregar eventos a la cola de eventos (el operador -= puede eliminar eventos de la cola).

6. Escriba el método de activación del evento llamando al delegado donde se debe activar el evento. En términos generales, este método debe protegerse con restricciones de acceso y no puede llamarse en modo público ni heredarse por subclases. El nombre es OnEventName.

7. Llame al método de activación de eventos para activar el evento en el lugar apropiado. Aquí hay un ejemplo simple:

Usa el sistema;

Clase pública EventTest

{

//Paso 1, define el delegado objeto .

Delegado público void MyEventHandler(Remitente del objeto, system. EventArgs e

//Omitir el paso 2

Clase pública MyEventCls

{

//El tercer paso es definir el método de procesamiento de eventos, que tiene los mismos parámetros y clase/tipo de valor de retorno que el objeto delegado.

public void MyEventFunc(Remitente del objeto, system. EventArgs e)

{

Consola. WriteLine("¡Mi actividad está bien!");

}

}

// El cuarto paso, use la palabra clave event para definir el objeto del evento.

Evento privado MyEventHandler myevent

MyEventCls privado myecls

Evento público test()

{

mis ecls = new MyEventCls();

//Paso 5, use el operador = para agregar el evento a la cola.

this.myevent = new MyEventHandler(myecls.MyEventFunc);

}

// El sexto paso es escribir la función de activación del evento llamando al delegado. .

Nulo protegido OnMyEvent(System.EventArgs e)

{

if(myevent!=null)

myevent(this, e );

}

public void RaiseEvent()

{

EventArgs e = new EventArgs();

//El séptimo paso es activar el evento.

en myevent(e);

}

Evento vacío estático público Main()

{

evento test et = nuevo evento test();

Console. Write("Por favor ingrese ' ' a '');

String s = console. ReadLine();

if(s == "a ")

{

et.RaiseEvent();

}

Otro

{

Consola WriteLine(. " Error ");

}

}

}