u014543645
cstymyyy
采纳率0%
2015-01-27 08:45

简单介绍一下C#中的delegate的作用?

就是对C#中delegate的用法不是很清楚,是不是类似于C++中的函数指针

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

6条回答

  • vb763305825 我真的不是菜鸟 6年前

    C#是强类型语言,所有数据都有类型,delegate就是"方法类型",其实就是函数指针啦。

    先来简单地看看int类型的数据(变量)怎么使用:

    先定义一个类型 int,然后给一个名字number当做变量名,最后赋值一个1给它,那么这个number变量就可以供我们使用了

    int number = 1;
    

    用来保存方法的返回值:

    number = add(10,20);
    

    或者传到函数里面:

    var result = add(number,20);
    

    那么方法呢? 我们想用一个变量来保存"方法"和把"方法"当做参数传到另外一个方法里面该怎么做?

    int Add(int a,int b){
         return a + b;
    }
    
    加法函数类型  addFunc = Add //把Add函数地址的指针指向addFunc变量(其实就是赋值)
    

    同样也是先定义类型 "加法函数类型" 然后给一个名字addFunc当做变量名,最后赋值一个add()方法给它,那么我们就可以把方法存到一个变量里面了,当然也就意味着可以传参了。
    但"加法函数类型" 这个类型C#里面是没有的,这个时候delegate关键字就派上用场了。

    delegate int 加法函数类型(int a,int b); 
    

    这样就定义好"加法函数类型"了

    delegate int 加法函数类型(int a,int b); 
    
    加法函数类型 addFunc = (a,b)=> a + b;
    
     int Todo(加法函数类型 func ){
         int a = 20;
             int b = 30;
             int c = func(a,b); 
            return c * 100;
    }
    
    var result = Todo(addFunc);
    
    

    了解C\C++里面的函数指针就应该很容易就能理解C#里面的"委托"。 而且,委托是类型安全的。

    点赞 评论 复制链接分享
  • swordvming 不吃辣的阿银 6年前

    给你说一个实例,比如查询一个数据量大约百万的数据表,在查询的过程中界面是会呈现“假死”,也就是卡死的状态,直到返回查询结果才恢复。
    这时,通常会使用多线程 Thread 来新建一个线程去执行这条语句,这样主界面所在的主线程不会受影响,也就不会出现界面卡死的情况。
    说了这么多还没说到deleate,也就是委托。如果子线程在执行的过程中,想要调用主线程所创建的控件(也就是界面控件),就会报错,这时就会用到委托。利用委托让子线程调用主线程的控件。

    点赞 1 评论 复制链接分享
  • mychaint mychaint 6年前

    委托就是c++中的函数指针。
    委托是放置方法的容器,可以通过委托来调用特定方法而无需知道具体方法的名称。

    比如开发界面上的按钮button, 可以为onclick事件申明一个委托,一旦发生点击事件便出发委托里所放的函数。但是这个放置在委托中的函数可以随意改变,button类确无需进一步修改了。

    最后以一个老段子来解释委托:

    你好我是 王先生 (一个对象 王先生)
    我可以帮你写程序 (类似对象的成员方法,叫编程)
    我的联系方式是 (类似呼叫王先生的委托)
    有事请给我打电话。(类似通过委托来呼叫对象成员方法)

    点赞 评论 复制链接分享
  • lkyllj098 lkyllj098 6年前

    个人感觉代理主要用于多线程,最直观的就是winform程序进度条

    点赞 评论 复制链接分享
  • oyljerry oyljerry 6年前

    就是类似函数指针,换了一种申明,调用方法

    public delegate void DelegateMethod();
    这就申明了一个类型,然后就可以用它去接收同类型的函数指针

    Delegate和C++中函数指针的区别

    Delegate和C++中的函数指针很像,但如果深入对比,发现其实还是有区别的,区别主要有三个方面(参考Stanley B. Lippman的一篇文章)
    
      1) 一个 delegate对象一次可以搭载多个方法(methods),而不是一次一个。当我们唤起一个搭载了多个方法(methods)的delegate,所有方法以其“被搭载到delegate对象的顺序”被依次唤起。
    
      2) 一个delegate对象所搭载的方法(methods)并不需要属于同一个类别。一个delegate对象所搭载的所有方法(methods)必须具有相同的原型和形式。然而,这些方法(methods)可以即有static也有non-static,可以由一个或多个不同类别的成员组成。
    
      3) 一个delegate type的声明在本质上是创建了一个新的subtype instance,该 subtype 派生自 .NET library framework 的 abstract base classes Delegate 或 MulticastDelegate,它们提供一组public methods用以询访delegate对象或其搭载的方法(methods) ,与函数指针不同,委托是面向对象、类型安全并且安全的。
    
    点赞 评论 复制链接分享
  • testcs_dn 微wx笑 6年前

    我个人的理解,delegate就是用来实现Invoke调用的。就是跨线程调用。比如在线程中调用WinForm的方法,对WinForm组件进行操作之类的。

    点赞 评论 复制链接分享