委托
是把一个方法当作一个参数放到声明(deletgate)委托中。给另一个方法使用,或者直接执行委托。
1 class Delegates 2 { 3 public delegate void mydelegate(string msg); 4 static void Main(string[] args) 5 { 6 mydelegate myd = new mydelegate(father.BuyToys); 7 myd("BBB"); 8 Console.Read(); 9 } 10 } 11 public class father 12 { 13 public static void BuyToys(string msg) 14 { 15 Console.WriteLine(msg); 16 Console.WriteLine("AAA"); 17 } 18 }
上面可以看出首先声明一个委托,在实例委托时把father类中的BuyToys方法当作参数放到委托中。然后在使用委托。输出结果:BBB AAA。
泛型委托
Action<T>:没有返回值的委托。或者返回是空的委托(就是直接返回return)
Func<T,TResult>:必须要有返回值的委托。T是带入参数的类型,TResule是返回参数的类型
一般使用委托需要先显示声明委托。
public delegate void mydelegate(string msg);
而如果使用泛型委托就可以不用显示声明委托。
public delegate void ShowName(); public delegate void ShowNameWithParameter(string name); ShowName showName = person.DisplayName; showName(); ShowNameWithParameter showNameWithParameter = person.DisplayName; showNameWithParameter(person.InstanceName); //上面是显示委托,下面是泛型委托 Action actionShowName = person.DisplayName; actionShowName(); Action<string> actionShowName1 = person.DisplayName; actionShowName1(person.InstanceName);
Func<string, int> funReturnName = person.GetAgeByName;
Console.WriteLine("Age:{0}", funReturnName(person.InstanceName));
异步委托
异步委托需要使用到BeginInvoke,这个是把BeginInvoke方法以使用线程异步地执行委托所指向的方法。然后通过EndInvoke方法获得方法的返回值。
private static int newTask(int ms) { Console.WriteLine("任务开始"); Thread.Sleep(ms); Random random = new Random(); int n = random.Next(10000); Console.WriteLine("任务完成"); return n; } private delegate int NewTaskDelegate(int ms); static void Main(string[] args) { //NewTaskDelegate task = newTask; Func<int, int> task1 = newTask; IAsyncResult asyncResult = task1.BeginInvoke(2000, null, null); // EndInvoke方法将被阻塞2秒 int result = task1.EndInvoke(asyncResult); Console.WriteLine(result); Console.Read(); }
上面的执行结果是,先出现任务开始,暂停2秒,获取随机数,显示任务完成,最后因为EndInvoke返回随机数,显示随机数。