1.通过委托,可以执行它所引用的方法,并且传递方法的参数。
只要方法的签名与为委托的签名匹配,该方法及其参数就可以被赋予委托。
委托也可以作为参数实现CallBack。
委托也有作用域,然而不能用static关键字。
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace DelegateSimple
- {
- class Program
- {
- public delegate void MessagePrintDelegate(string msg);
- public delegate int GetCountDelegate(Person p1, Person p2);
- public delegate void LongRunningDelegate(MessagePrintDelegate mpd);
- static void Main(string[] args)
- {
- MessagePrintDelegate mpdDel = new MessagePrintDelegate(MessagePrint);
- LongRunningDelegate lrDel = new LongRunningDelegate(LongRunning);
- GetCountDelegate gcDel = new GetCountDelegate(GetCount);
- int count = gcDel(new Person(), new Person());
- Console.WriteLine("count: {0}", count);
- lrDel(mpdDel);
- }
- static void MessagePrint(string msg)
- {
- Console.WriteLine("[{0}], {1}", DateTime.Now.ToShortDateString(), msg);
- }
- static void LongRunning(MessagePrintDelegate mpd)
- {
- for (int i = 0; i != 99; i++)
- {
- if (i % 10 == 0)
- {
- mpd(string.Format("Making progress. {0}% complete.", i));
- }
- }
- }
- static int GetCount(Person obj1, Person obj2)
- {
- Random rdm = new Random();
- return rdm.Next();
- }
- public class Person
- { }
- }
- }
2.委托的协变(covariance)是指一个委托方法能够返回派生数据类型的能力。
逆变(contravariance)是指委托方法能过以派生类为参数的能力。
3.匿名方法允许对一个委托进行实例化的同时定义方法。
- using System;
- using System.Collections.Generic;
- using System.Text;
- namespace AnonMethods
- {
- class Program
- {
- delegate void MessagePrintDelegate(string msg);
- static void Main(string[] args)
- {
- MessagePrintDelegate mpd = new MessagePrintDelegate(MessagePrint);
- LongRunning(mpd);
- Console.WriteLine();
- MessagePrintDelegate mpd2 = delegate(string msg)
- {
- Console.WriteLine("[Anonymous] {0}", msg);
- };
- LongRunning(mpd2);
- Console.WriteLine();
- string source = "Outer";
- MessagePrintDelegate mpd3 = delegate(string msg)
- {
- Console.WriteLine("[{0}] {1}", source, msg);
- };
- LongRunning(mpd3);
- }
- static void LongRunning(MessagePrintDelegate mpd)
- {
- for (int i = 0; i != 100; i++)
- {
- if (i % 25 == 0)
- {
- mpd(string.Format("Process {0}% completed.", i));
- }
- }
- }
- static void MessagePrint(string msg)
- {
- Console.WriteLine("[MessagePrint] {0}", msg);
- }
- }
- }
4.多播委托是通过对方法的委托进行组合而创建的。用+, -, +=, -=操作符。