• c#的委托是什么


    之前囫囵吞枣的看了一遍c#的入门书,还是有很多不懂的地方,比如这个delegate委托,书里面就完全没有提到过。查中文资料又翻译的让人看不懂,还不如直接看英文了。这边我试着翻译一下,翻的不好请指出
    
    原文来自 [code project](http://www.codeproject.com/Articles/11657/Understanding-Delegates-in-C)
    

    c#的委托是啥

    Arul Nayagam C

    前言

    委托是c#.net里面很玄的一个东西,这篇文章里面我试着解释一下委托是啥,还有多重委托是啥,以及在c#里面的简单应用。

    什么是委托?

    委托是一种类型,不过它指向的不是数字啊,字符串啊之类的,它指向的对象方法引用(我好晕),而且他还是可以保证这种引用不会出现类型错误。(这是不是也算静态检查的一种?)

    优势

    • 充当中间人把方法保护起来
    • 可以让程序效率更高
    • 还可以用来对方法进行异步调用。(啥是异步调用……)

    如何声明一个委托?

    public delegate type_of_delegate delegate_name()

    举个栗子:

    public delegate int mydelegate(int delvar1,int delvar2)

    注意:

    • 括号里面的参数没有也行,另外也可以在这里用参数的列表(List?)
    • 委托的格式一定要和对应的方法一致,不管是整个委托的类型,还是参数的类型,比如引用的方法参数是两个int,返回值也是int,那这边委托的声明也一样要参照这些来设置。所以委托可以保证避免类型错误。

    例程

    public delegate double Delegate_Prod(int a,int b);class Class1
    
    {
    static double fn_Prodvalues(int val1,int val2)
    {
        return val1*val2;
    }
    static void Main(string[] args)
    {
        //Creating the Delegate Instance
        Delegate_Prod delObj = new Delegate_Prod(fn_Prodvalues);
      //msdn文档里面看到也可以这么写Delegate_Prod delObj=fn_Prodvalues;
      //感觉这样写更有委托的味道
    
        Console.Write("Please Enter Values");
        int v1 = Int32.Parse(Console.ReadLine());
        int v2 = Int32.Parse(Console.ReadLine());
        //use a delegate for processing
        double res = delObj(v1,v2);
        Console.WriteLine ("Result :"+res);
        Console.ReadLine();
    }
    }

    解释一下:

    我们这个程序主要是讲解一下委托怎么用

    Delegate_Prod这个委托具有double类型,接受的参数也是两个double类型

    而在类里面,fn_Prodvalues这个方法也是返回double,接受两个double参数,看到了吧,一样的吧?

    在main方法里面,我们给Delegate_Prod建立了一个实例,然后把fn_Prodvalues这个方法的名称交给Delegate的实例了

    Delegate_Prod delObj = new Delegate_Prod(fn_Prodvalues);

    接下来,我们就不会让fn_Prodvalues直接与外界接触啦,如果要接触,参数要经过delegate传输,就像这样:

    delObj(v1,v2);

    然后方法返回的结果也是经由delobj这个委托的实例传输回来。

    多重委托

    什么是多重委托呢?其实就是一个委托同时接了几个活,引用了一个以上的方法。

    鉴于它这么猛,没有方法会认真对待他,所以不会有结果传回:多重委托的引用对象还有它自己都必须是void类型的

    再举一个简单的例子:

    delegate void Delegate_Multicast(int x, int y);
    Class Class2
    {
    static void Method1(int x, int y)
    {
        Console.WriteLine("You r in Method 1");
    }
    
    static void Method2(int x, int y)
    {
        Console.WriteLine("You r in Method 2");
    }
    
    public static void <place w:st="on" />Main</place />()
    {
        Delegate_Multicast func = new Delegate_Multicast(Method1);
        func += new Delegate_Multicast(Method2);
        func(1,2);             // Method1 and Method2 are called
        func -= new Delegate_Multicast(Method1);
        func(2,3);             // Only Method2 is called
    }
    }

    解释:

    上面的程序里面,两个方法,method1和method2都是接受两个int参数,void无返回。

    然后main方法里面,这个多重委托就这么声明好了,顺便还送了一个方法进去:

    Delegate_Multicast func = new Delegate_Multicast(Method1);

    然后我们又用+=再送了一个方法给他

    后面我们又用-=从他那里拿走了一个方法

    总结

    这篇文章简单的讲解了一下委托的概念,举了几个简单的小程序作为例子。如果你对于这篇文章有什么问题,联系原作者in english,arul_tony@yahoo.com.

  • 相关阅读:
    django orm 以列表作为筛选条件进行查询
    申请Let's Encrypt通配符HTTPS证书
    redis集群部署及踩过的坑
    MySQL的索引是什么?怎么优化?
    Session管理之超时设置和强制下线
    在MySQL中使用explain查询SQL的执行计划
    基于Docker搭建MySQL主从复制
    这些年一直记不住的 Java I/O
    高并发大容量NoSQL解决方案探索
    php 如何生成静态页
  • 原文地址:https://www.cnblogs.com/SiumingLearning/p/delegate_in_c_sharp.html
Copyright © 2020-2023  润新知