zoukankan      html  css  js  c++  java
  • 关于C#中的Delegate的一些知识

    为什么要使用Delegate?

    下面是从CSDN摘取来的有助理解的回复

    如楼主所说,有些地方可以直接调用对象的方法,而不用委托。
    但有些时候这样做不合适。
    比如,在写这个类的时候,根本就不能确定要调用哪个对象的方法:例如,你把自己的一个对象上的方法挂在微软的textbox 的一个事件上。微软在写textbox时根本就不可能知道这个事件发生时,需要调用哪个对象的哪个方法,只有你自己去指定说需要调什么方法,并且以委托的 方式挂在相应的事件上。

    微软在写textbox的事件时,唯一能确定的是这个事件的格式,或者说这个事件需要调用的方法的格式,
    类似于  button1_click(object sender, EnentArgs e) 等等。  只要是按照这个类型写的方法,都能被挂在这个事件上,并且在事件发生时,方法会被调用。

    而规定了事件方法格式,就确保了事件发生时被调用的方法都是合法的,不会出现方法类型不匹配等等。这就是所谓的委托是类型安全的。而c++下面用 void* 的函数指针实现事件处理缺少对函数格式的检查。 所以C# 发明了委托这个怪东西,为的就是然被调用的函数格式正确。

    这只是基于消息驱动的实现方式之一。

    另一个普遍的方式,是使用接口。这是java的事件处理方式。 它以接口的形式规定了被调用方法的格式。这种方式更直接,更简单,更容易理解。

    两种方式各有利弊,有各自的使用场景,但从效果上看是等效的。

    ------------------------------------------------------------

    7楼给你说的是事件,我直接给你举个委托的例子。
    现在我要对一系列数据进行排序,而排序算法可能比较复杂,我不会自己写,我想调用Array.Sort方法,微软为我们提供了快速排序算法。
    但是这里有一个问题——我要实现自定义排序规则,比如对于字符串,默认的是按字母顺序,但现在我想这样排序:

    按字符串长度排序,只有当长度不同时,再按字母排序。

    显然,微软不可能提供这样“个性”的排序方法,那是不是说,就必须让我们自己去写快速排序算法呢?
    不需要!
    我们只需要使用委托,就能实现这个要求:
    string[]strs="I like C# very much".Split();
    Array.Sort(strs,Rule);
    int void Rule(string first,string second)
    {
    return first.Length==second.Length?first.CompareTo(second):first.Length.CompareTo(second.Length);
    }

    显然,我并不需要知道快速排序算法的逻辑,我只需要告之排序规则,就实现了我的个性排序。

    试问:如果没有委托,你如何解决这个问题?

    -------------------------------------------------------------------

    也不是解决不了,定义一个接口,然后你自己继承那个接口写一个类,在接口函数里把排序规则写好.
    然后给它传个类实例,排序内部把那个实例当接口处理就可以了,java就是这样解决的.
    不过...
    很显然.对于新写一个类来说我更愿意使用委托一条函数解决问题.新写一个类我要多敲多少次键盘呐...
    而且在C#3.0里我连新函数都懒得写,一个Lambda表达式搞定

    原贴:

    http://topic.csdn.net/u/20090102/23/b26f5193-8eb1-4c57-a129-123ddbbe85a4.html

  • 相关阅读:
    EasyUI
    EasyUI
    EasyUI
    django MTV架构下的网站开发步骤
    Centos7下安装python3
    python 线程间事件通知
    hadoop MapReduce
    hadoop文件配置
    DataFrame 数据去重
    用selenium获取cookies
  • 原文地址:https://www.cnblogs.com/Sabre/p/1544315.html
Copyright © 2011-2022 走看看