为什么用委托

刚学习委托时无论老师怎么开导,我都是一头雾水,不是听不懂,也不是不会写,就是不明白为什么要用委托,看不出来一点好处,而且写很多没用的代码,每当这么问老师时,老师总说:用委托会使你的代码更灵活,我的天啊,和没说一样,后来参加工作了两年竟然一直没有用到委托也没什么觉得不妥,直到有一天看到了张子阳的“事件和委托”让我大吃一惊研读了几天终于弄懂了一点事件和委托,这时突然感觉以前写的程序都不是程序,起码不是面向对象的程序,因为事件和委托是面向对象编程精髓。

上几天一个同事问我什么是委托,我告诉他:“委托是方法的指针,可以把方法当参数用......,懂么?”,他说懂了。他又问我为啥要用委托不用不行么我依然可以实现委托能实现的任何功能,这时我想像我老师一样的告诉他,他肯定会和我一样迷糊2年,于是我给他出了一道题:实现一个能定时做某事的类就像winform的timer一样的东西,他实现的代码如下:

public class Timer
{
public static void start(int sleep)
{
  ThreadStart ts = new ThreadStart(DoSomething);
  Thread th = new Thread(ts);
  th.Start();
}
/// <summary>循环做事
/// </summary>
public static void DoSomething()
{
  while (true)
  {
  writeFile();
  Thread.Sleep(1000);//线程休眠1秒
}
}
/// <summary>写文件
/// </summary>
public static void writeFile()
{
  System.IO.StreamWriter sw = new System.IO.StreamWriter("path");
  sw.Write("ok");
  sw.Close();
  sw.Dispose();
}
}

恩,很快就实现了,可以1秒钟写一次文件,那我要一秒钟向数据库插入一条记录呢?于是他修改代码如下:

public class Timer

{

   public static int doType = 0;

   public static void start(int sleep)

   {

    ThreadStart ts = new ThreadStart(DoSomething);

    Thread th = new Thread(ts);

    h.Start();

   }

        /// <summary>循环做事

        /// </summary>

        public static void DoSomething()

        {

            while (true)

            {

                if (doType == 0)

                    writeFile();

                else if(doType==1)

                    InsertDB();

                Thread.Sleep(1000);//线程休眠1秒

            }

        }

        /// <summary>写文件

        /// </summary>

        public static void writeFile()

        {

            System.IO.StreamWriter sw = new System.IO.StreamWriter("path");

            sw.Write("ok");

            sw.Close();

            sw.Dispose();

        }

        public static void InsertDB()

        {

            //写数据库

        }

}

这不是很容易么?你要做啥事都行,我只要加分支判断就可以了。我问他:先不说你这些代码是否符合“开闭原则”和"单一职责原则",就说你这代码别人要怎么使用,拷过去添加一个方法再添加一个分支判断?你起码提取一下做个通用类,像winform的timer一样别人只要传给你两个参数1.间隔时间,2.要做的事,剩下就是你的事了。于是他又修改了代码:

public class Timer

{

    public static void start(int sleep, ? doSomething)

    {

    }

}

他写到这说:不会写了,我不知道doSomething应该是啥类型,他是别人传给我要执行的方法。我告诉他doSomething的类型就应该是一个委托,委托适合用在某时或某种情况执行某些事,而这些事你事先并不知道是啥。就像本例中,你想间隔1秒钟替别人执行某件事,但你设计这个类的这个方法时还不知道别人到底要你做什么事。用现实生活中的示例做比喻:一个律师能替人打官司,他可以打任何类型的官司,但只有原告委托律师打官司时律师才知道自己要打什么类型的官司,所以律师就是一个委托。好了下面我们来看一下我实现的Timer类:

public class Timer
{
  public delegate void TimerHandler();
  public static void start(int sleep, TimerHandler doSomething)
  {
    ThreadStart ts = new ThreadStart(() => { while (true) { Thread.Sleep(sleep); doSomething(); } });
    Thread th = new Thread(ts);
    th.Start();
  }
}

由于当时我正在学习匿名方法和Lambda所以ThreadStart参数用Lambda代替了具体的函数。

委托可以理解为:将一些有相同特征的函数(参数个数,参数类型)抽象成一个公用的委托,委托其实可以认为是这些相同特征函数的一个别名。

1、调用这些函数组中的某一个函数时,只要实例化出这样的一个委托对象,通过这个委托对象传入相应的参数即可实现调用原函数的目的。

2、多路广播委托,委托对象的绑定

static void Main(string[] args)
{

GetTest test = new GetTest(A);
test += new GetTest(B);
test();

Console.Read();
}

public delegate int GetTest();

public static int A()
{
Console.WriteLine("A");
return 1;
}
public static int B()
{
Console.WriteLine("B");
return 1;
}

时间: 2024-10-24 21:19:48

为什么用委托的相关文章

c#系统泛型委托

Action<T> 无返回值的系统泛型委托 namespace ConsoleApp1 { public class UserInfo { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } } class Program { private static List<UserInfo> getInit() { return new List<User

《C#图解教程》读书笔记之五:委托和事件

本篇已收录至<C#图解教程>读书笔记目录贴,点击访问该目录可获取更多内容. 一.委托初窥:一个拥有方法的对象 (1)本质:持有一个或多个方法的对象:委托和典型的对象不同,执行委托实际上是执行它所"持有"的方法.如果从C++的角度来理解委托,可以将其理解为一个类型安全的.面向对象的函数指针. (2)如何使用委托? ①声明委托类型(delegate关键字) ②使用该委托类型声明一个委托变量 ③为委托类型增加方法 ④调用委托执行方法 (3)委托的恒定性: 组合委托.为委托+=增加

C# 委托,Lambda表达式,事件

本文章参考sikiC#高级篇,转载请注明出处. 什么是委托 如果我们要把方法当做参数来传递的话,就要用到委托.简单来说委托是一个类型,这个类型可以赋值一个方法的引用. 声明委托与使用 声明委托有四种方式.一种是原生的,另外三种是C#为了方便给我们封装好的. 四种声明方式分别为delegate, Action, Func, 在C#中使用一个类分为两个阶段,首先定义这个类,告诉编译器这个类由什么字段和方法组成,然后使用这个类实例化对象.在我们使用委托的时候,也需要经过这两个阶段,首先定义委托,告诉编

泛型委托当参数传递

假如有一个Person类: public class Person { public int Id { get; set; } public string Name { get; set; } public int Age { get; set; } public string Title { get; set; } } 执行一个方法: /// <summary> /// 传递一个泛型委托方法 /// </summary> /// <param name="acti

类库,委托,is和as运算符,泛型集合

类库:其实就是一堆类文件,只不过用户看不到这些类的源代码,保密性好. 优点:保密性好缺点:如果这个方法不好用,使用者无法自己去更改它. 类文件是.cs    类库是.dll 新建项目为类库,在debug文件夹下找到dll文件 委托:委托可以理解为:函数的指针 关键词:delegate 声明委托类型:public delegate int FirstDel(int a, int b); FirstDel不是类,是委托变量,不能实例化(不能new), 创建委托变量:FirstDel 名字 = 与这个

泛型委托

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 泛型委托 { public delegate int DelCompare<T>(T t1, T t2); // public delegate int DelCompare(object o1, object o2); class Progra

javascript中的事件委托

这几天看到一个面试题,大概就是,让你给1000个li都添加一个click事件,应该怎么添加?大多数人第一开始的感觉可能就是,每个li上边都添加一个呗,那要是这样的话,估计面试的时候就会GG了,这里就是撤出了我们的事件冒泡和捕获机制,以及事件委托机制,对于上边这些,我们慢慢来看. 首先说一下事件冒泡和事件捕获机制,事件冒泡是有微软公司提出来的,事件捕获是有网景公司提出来的,当时两家是争论的不可开交,后来w3c也没办法,就采取了折中的方式,事件产生后先捕获后冒泡, 通常,在js中监听事件的方法共有三

[JS]笔记14之事件委托

-->什么是事件委托-->事件委托原理-->事件委托优点-->事件源 / 目标源 一.什么是事件委托 通俗的讲,onclick,onmouseover,onmouseout等这些就是事件 委托,就是这个事件本来应该加在某些元素上的,而你却加到其他元素上来完成这个事件. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> &

事件委托能够优化js性能

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>面试题练习img居中</title> <style type="text/css"> img { /*display: table-cell; vertical-align: middle;*/ } html,body{ height: 100%; } div{ w

C#高级知识点概要(1) - 委托和事件

作者:linybo 要成为大牛,必然要有扎实的基本功,不然时间再长项目再多也很难有大的提升.本系列讲的C# 高级知识点,是非常值得去撑握的,不仅可以让你写代码时游刃有余,而且去研究和学习一些开源项目时,也不会显得那么吃力了. 希望大家记住,这里讲的所有的知识点,不仅仅是了解了就可以了,还要会灵活用,一定要多思考,撑握其中的编程思想. 本文讲的是委托和事件,这两个词可能你早就耳熟能详,但你是否真正撑握了呢? 本系列讲的C#高级知识点都是要求开发时能达到可以徒手写出来的水平(不依赖搜索引擎.找笔记等