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

  • 相关阅读:
    codeforces C. Fixing Typos 解题报告
    codeforces B. The Fibonacci Segment 解题报告
    codeforces B. Color the Fence 解题报告
    codeforces B. Petya and Staircases 解题报告
    codeforces A. Sereja and Bottles 解题报告
    codeforces B. Levko and Permutation 解题报告
    codeforces B.Fence 解题报告
    tmp
    API 设计 POSIX File API
    分布式跟踪的一个流行标准是OpenTracing API,该标准的一个流行实现是Jaeger项目。
  • 原文地址:https://www.cnblogs.com/Sabre/p/1544315.html
Copyright © 2011-2022 走看看