代码改变世界

委托、泛型委托、异步委托(新人,有问题请指出,有部分代码是拿其他博客主的)

2016-06-12 21:31  火的天堂  阅读(507)  评论(0编辑  收藏  举报

委托

     是把一个方法当作一个参数放到声明(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返回随机数,显示随机数。