首页 > 代码库 > C#中的委托

C#中的委托

 

 做项目一段时间,经常用到委托和一些Lambda表达式,在这里也对这些东西总结一下。


 1.什么是委托?

 说实在的,用了这么多,突然让说一下委托的定义,确实还有难度。在我看来,委托跟平常的方法差不多,但是功能却十分的强大。强大到什么地方呢?方法中可以有参数,委托既然类似于方法,所以也有参数,但是参数的内容可以是方法。

 技术分享

 

 2.委托用法

 委托在用法上与类的用法又特别的相同,比如在使用某个类的时候,必须先进行实例化。下面看一个Demo

<span style="font-family:SimSun;font-size:18px;">namespace ConsoleApplication1
{
    public class B
    {

        //定义一个委托对象
        //因为委托中传入的是方法,在此委托就好比是一些方法的模型
        //比如这时定义的一个委托,就要求传入的方法返回值是void
        //参数必须是一个string类型的字符串
        delegate void Test(string name);

        //测试方法一
        public static void Test1(string name)
        {
            Console.WriteLine(name);
        }

        //测试方法二
        public static void Test2(string age)
        {
            Console.WriteLine(age);
        }

        //使用委托
        static void Main(string[] args)
        {

            //使用委托
            //用法与类相似,用前必须先实例化一个委托对象
            Test test = new Test(Test1);
            //通过实例化后,该委托就成为了方法的一个代理
            test("校长");
             

            Console.ReadLine();
        }
    }
}</span>


 小结:通过上述代码,我们也看到,在用法上委托与类相似,在功能上与方法相似。



  3.匿名委托

  看了上述的代码,基本上算是对委托有了初步的理解,只要掌握以下用法即可。下面来看一下,匿名委托,与委托一样,只不过变了一下模样而已。

 

<span style="font-family:SimSun;font-size:18px;">  public class C 
    {
        static void Main(string[] args)
        { 
            //以前用的时候还需要实例化,现在又了匿名的委托
            //不用再实例化委托对象了
            //采用Lambda表达式书写的一个匿名委托
            DelCompare del = (t1, t2) => { return t1+t2; };

            //直接匿名委托
            DelCompare del1 = delegate(int t1,int t2) { return t1+t2; };

            //调用委托方法
            int n = del(3, 4);
            int n1 = del1(3, 4);
            
        }
    }</span>


 上述代码只不过是在委托的基础上,变了一下型而已。到底,通过上述两次代码展示,我们已经知道用委托的方法已经有三种形式了。


 4.异步委托

   小编在学习委托的时候,看了一下MSDN文档,发现了一个好东西。异步委托。

   BeginInvoke 方法:在创建控件的基础句柄所在线程上异步执行指定委托。

   具体的实现原理,也不是很清楚,但是看到异步执行指定委托,小编就有点兴奋了。于是小编那这个方法执行委托,与上述进行的对比,发现能够快上1000倍。什么都不说了,直接上代码吧!


<span style="font-family:SimSun;font-size:18px;">   delegate void DelTest();
    public class D
    {
        //回调函数,当异步委托的方法执行完毕之后调用的方法
        public static   void Callback(IAsyncResult ar)
        {
            Console.WriteLine("OVER");      
        }


        static void Main(string[] args)
        {
            //实例化委托对象
            DelTest del = Test;
            //委托的异步调用
            del.BeginInvoke(Callback, null);

            Console.WriteLine("测试");
        }

        public static void Test()
        {
            Console.WriteLine("测试");
        }
    }</span>

  5.Action<T> 委托和Func<T,TResult> 委托

    贴心的微软,真的是为人民服务哈。看看上面我们用委托的繁琐的过程,于是微软基于这点考虑,给我们封装了两个函数。


    Func<T,TResult> :封装一个具有一个参数并返回TResult 参数指定的类型值的方法。            

    Action<T>:封装一个方法,该方法只有一个参数并且不返回值。

    这两者的区别就是在于有没有返回值,具体的实例,可以参考MSDN,在此就略微的提一下。

   






C#中的委托