[Notas de lectura] El estudio de C # señala dos: el uso y las diferencias de delegados y eventos.


[Notas de lectura] El estudio de C # señala dos: el uso y las diferencias de delegados y eventos.


Prefacio: 

¿Qué es el delegado de C #?                                                                                                                                                                                              

La delegación en c # puede entenderse como un contenedor de la función, que permite pasar la función en C # como parámetro, lo que equivale al puntero de función en C ++. C ++ usa el puntero de función para obtener la dirección de entrada de la función, y luego a través de este Puntero para realizar el funcionamiento de la función.

La definición de delegado es similar a la definición de método, excepto que se agrega una palabra clave de delegado antes de la definición.

 

texto:


Un delegado puede considerarse como un puntero de nivel superior. No solo puede pasar la dirección a otra función, sino también pasar información múltiple como parámetros y valores de retorno.
El sistema también genera automáticamente métodos de invocación síncronos y asincrónicos para objetos delegados.Los desarrolladores pueden utilizar los métodos BeginInvoke y EndInvoke para abandonar Thread y utilizar directamente la invocación multiproceso.

 

1. La delegación de
análisis de IL muestra que Delegate hereda de la clase System.MulticastDelegate y genera automáticamente tres métodos comunes: BeginInvoke, EndInvoke e Invoke.

El método Invoke se usa para llamar al método correspondiente del objeto delegado sincrónicamente, mientras que BeginInvoke y EndInvoke se usan para llamar al método correspondiente de manera asincrónica.

1.1 Delegación simple
Al establecer un objeto delegado, el tipo de parámetro del delegado debe corresponder al método del delegado. Siempre que el nombre del método example.Method se ingrese en el constructor del objeto delegado, el delegado será sencillo

Luego une este método.
Usando myDelegate.Invoke (mensaje de cadena), puede llamar al método delegado explícitamente.
Pero en la operación real, no necesitamos usar el método Invoke, pero siempre que use directamente myDelegate (mensaje de cadena), puede llamar al método delegado.

Copiar codigo

 1 clase Programa 2 {3 void MyDelegate (mensaje de cadena); 4 5 public class Example 6 {7 public void Method (string message) 8 {9 MessageBox.Show (message); 10} 11} 12 13 static void Main (string [] args) 14 {15 Ejemplo de ejemplo = new Example () ; 16 MyDelegate myDelegate = nuevo MyDelegate (ejemplo.Método); 17 myDelegate ("Hola mundo"); 18 Console.ReadKey (); 19} 20}

Copiar codigo

 

1.2 Comisión con valor de retorno

Al crear un objeto delegado, el valor de retorno del delegado debe corresponder al método delegado. Usando el ejemplo siguiente, el método devolverá "Hello Leslie".

Copiar codigo

 1 class Program 2 { 3     delegate string MyDelegate(string message); 4  5     public class Example 6     { 7         public string Method(string name) 8         { 9             return "Hello " + name;10         }11     }12 13     static void Main(string[] args)14     {15         Example example=new Example();16         //绑定委托方法17         MyDelegate myDelegate=new MyDelegate(example.Method);18         //调用委托,获取返回值19         string message = myDelegate("Leslie");20         Console.WriteLine(message);21         Console.ReadKey();22     }23 }

Copiar codigo

 

1.3 多路广播委托
在上面提过,委托类继承于MulticastDelegate,这使委托对象支持多路广播,即委托对象可以绑定多个方法。
当输入参数后,每个方法会按顺序进行迭代处理,并返回最后一个方法的计算结果。
下面的例子中,Price 类中有两个计算方法,Ordinary 按普通的9.5折计算,Favourable 按优惠价 8.5 折计算。
委托同时绑定了这两个方法,在输入参数100以后,Ordinary、Favourable这两个方法将按顺序迭代执行下去,最后返回 Favourable 方法的

计算结果 85。

Copiar codigo

 1 delegate double MyDelegate(double message); 2 public class Price 3 { 4     public double Ordinary(double price) 5     { 6         double price1 = 0.95 * price; 7         Console.WriteLine("Ordinary Price : "+price1); 8         return price1; 9     }10 11     public double Favourable(double price)12     {13         double price1 = 0.85 * price;14         Console.WriteLine("Favourable Price : " + price1);15         return price1;16     }17 18     static void Main(string[] args)19     {20         Price price = new Price();21         //绑定Ordinary方法22         MyDelegate myDelegate = new MyDelegate(price.Ordinary);23         //绑定Favourable方法24         myDelegate += new MyDelegate(price.Favourable);25         //调用委托26         Console.WriteLine("Current Price : " + myDelegate(100));27         Console.ReadKey();28     }29 }

Copiar codigo

 

1.4 Observer模式中的事件与委托 

Copiar codigo

 1 class Program 2 { 3     public delegate void ObserverDelegate(); 4      5     static void Main(string[] args) 6     { 7         // 具体主题角色通常用具体自来来实现 8         ConcreteSubject subject = new ConcreteSubject(); 9 10         //传入的只是观察者的通过方法。11         subject.Attach(new ConcreteObserver(subject, "Observer A").Update);12         subject.Attach(new ConcreteObserver(subject, "Observer B").Update);13         subject.Attach(new ConcreteObserver(subject, "Observer C").Update);14 15         subject.SubjectState = "Ready";16         subject.Notify();17 18         Console.Read();19     }20 21 22     //抽象主体类23     public abstract class Subject24     {25         public ObserverDelegate observerDelegate;26 27         //增加观察者28         public void Attach(ObserverDelegate observer)29         {30             observerDelegate += observer;31         }32 33         //移除观察者34         public void Remove(ObserverDelegate observer)35         {36             observerDelegate -= observer;37         }38 39         //像观察者发通知40         public void Notify()41         { 
42             if (observerDelegate != null)43             {44                 observerDelegate();45             }46         }47     }48 49     //具体主题类50     public class ConcreteSubject : Subject51     {52         public string SubjectState { get; set; }53     }54 55     //具体观察者56     public class ConcreteObserver57     {58         private string observerState;59         private string name;60         private ConcreteSubject subject;61 62         public ConcreteObserver(ConcreteSubject subject, string name)63         {64             this.subject = subject;65             this.name = name;66         }67 68         //实现抽象观察者中的更新操作69         public void Update()70         {71             observerState = subject.SubjectState;72             Console.WriteLine("The observer's state of {0} is {1}", name, observerState);73         }74     }75 }

Copiar codigo

 

Segundo, evento


(1) La encapsulación de la delegación durante el evento puede entenderse como una delegación especial.
(2) En el caso, en realidad hay dos métodos (a saber, add_event () y remove_event ()) y una variable delegada privada. Estos dos métodos se utilizan para ingresar la variable delegada privada.

La fusión y eliminación de líneas, cuando se llama al + = del evento, en realidad es el método add_event () en el evento llamado, y lo mismo - = está llamando al método remove_event ()
(3) El evento solo puede agregar nuevos métodos de respuesta desde fuera del objeto Y elimine los métodos de respuesta conocidos, pero no puede activar eventos de forma activa y obtener otros métodos de respuesta registrados y otra información. Si usa

Los delegados públicos no pueden hacer estas restricciones, lo que significa que los eventos restringen a los delegados, lo que hace que los delegados sean más convenientes de usar.
Algunas personas también dicen que el evento es la castración de la comisión, que probablemente sea lo mismo.

No hay mucha explicación sobre el evento aquí. Vi una buena publicación de blog sobre el evento. Te recomiendo que la leas: http://www.cnblogs.com/landeanfen/p/4721525.html

PD: Este blog es solo para registrar tus propias ganancias de aprendizaje. Como dice el refrán, una buena memoria no es tan buena como una mala pluma. Espero poder mantenerla. 

Categoría:  Serie básica de C #notas de lectura

Buen artículo debe  prestar atención a mi  artículo favorito  

¿Es una flor considerada romántica?


Supongo que te gusta

Origin blog.51cto.com/7592962/2543851
Recomendado
Clasificación