`
muyu114
  • 浏览: 136351 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

为什么要用委托

 
阅读更多

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

上几天一个同事问我什么是委托,我告诉他:“委托是方法的指针,可以把方法当参数用......,懂么?”,他说懂了。他又问我为啥要用委托不用不行么我依然可以实现委托能实现的任何功能,这时我想像我老师一样的告诉他,他肯定会和我一样迷糊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秒钟写一次文件,那我要一秒钟向数据库插入一条记录呢?于是他修改代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class Timer
{
public static int doType = 0;
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)
{
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.要做的事,剩下就是你的事了。于是他又修改了代码:

?
1
2
3
4
5
6
7
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代替了具体的函数。


转自:http://www.cnblogs.com/haog/archive/2010/09/18/1830295.html

分享到:
评论

相关推荐

    C#中的委托和事件(HTML)

    委托 和 事件在 .Net Framework中的应用...本文中,将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。

    C#的委托和事件详解

    委托 和 事件在 .Net ...本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。

    C#中的委托和事件详解(含源码)

    委托 和 事件在 .Net ...本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。

    C#委托时间最好的教程

    委托 和 事件在 .Net Framework 中...将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework 中的委托和事件、委托和事件对 Observer 设计模式的意义,对它们的中间代码也做了讨论。

    C#中的委托和事件chm

    委托 和 事件在 .Net Framework中的...本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。

    使用委托进行窗体传值.zip

    本教程将深入探讨如何使用委托来实现在多个窗体间的值传递。 首先,我们需要理解什么是委托。在C#中,委托是类型安全的函数指针,它定义了一种调用方法的签名。通过声明委托类型,我们可以创建一个对象,该对象可以...

    C#中的委托和事件原来如此简单

    首先,我们来看看为什么要使用委托。在上述例子中,`GreetPeople`方法原本直接调用了`EnglishGreeting`,但随着需求的变化,我们需要实现多语言支持。传统的做法是使用枚举`Language`来决定调用哪个问候方法,但这...

    C#委托事件-张子阳.pdf

    为什么需要委托** 在前面的例子中,我们看到了一个简化版的问题场景——不同语言的问候。最初,我们通过枚举来选择不同的问候方法,但这显然不是一个好的设计,因为一旦需要支持更多语言,就需要不断修改现有代码...

    委托实例,简单易懂

    C#中的委托相当于C++中的函数指针,也就说两者是有区别的:委托是面向对象的,类型安全的,是引用类型(开始就说了委托是个类),所以在使用委托时首先要 定义——&gt;声明——&gt;实例化——&gt;作为参数传递给方法——&gt;使用...

    使用委托进行窗体间传值

    "使用委托进行窗体间传值"是一种高效且灵活的方法,它利用了C#中的事件处理机制和委托的概念。下面我们将深入探讨这个主题。 首先,我们需要理解什么是委托。在C#中,委托是类型安全的函数指针,可以引用一个或多个...

    详解C#委托,事件与回调函数

    在使用委托时,需要将委托实例化,并将其指向要调用的方法。 事件是 C# 中另一个重要的概念,它可以在对象之间进行通信。事件可以看作是一个委托的集合,事件的发布者可以将事件发布给订阅者,订阅者可以对事件进行...

    C#委托代码样例DelegateDemo

    首先,让我们了解什么是委托。在C#中,委托类似于函数指针,但它更安全,类型安全,支持多播(即一个委托实例可以引用多个方法)。委托是引用类型,有自己的类型系统,定义了方法的签名,确保传递的方法具有兼容的...

    引用一个对象实例和该对象的实例方法。在 C 或 C 中与委托最接近的是函数指针,但函数指针只能引用静态函数,而委托可以同时引用静态方法和实例方法。在后一种情况中,委托不仅存储对方法入口点的引用,还存储对调用其方法的对象的引用。与 C 函数指针不同,委托是完全面对对象的;与指向成员函数的 C 指针不同,委托同时封装对象实例和方法。委托声明定义从类 System.Delegate 派生的类。委托实例封装一个或多个方法,每个方法都被称为可调用实体。对于实例方法,可调用实体由一个实例和该实例上的方法组成

    如果下面两个条件都为真,则方法和委托类型是兼容的:(兼容的概念就是可以用此声明的委托对方法进行委托). 1它们具有相同的参数数目,并且类型相同,顺序相同,参数修饰符也相同。 2它们的返回类型相同。

    C#委托和事件深入研究

    委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解...本文将通过范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义...

    委托与事件调用示例

    本示例将深入探讨如何使用委托和事件,以及它们在实际编程中的应用。 首先,我们来了解什么是委托。委托在.NET中可以看作是类型安全的方法指针,它允许我们将一个或多个方法引用存储在变量中,然后在后续的代码中像...

    java 使用委托控制权限

    首先,我们要理解什么是委托。在软件工程中,委托是一种设计模式,其中一个对象(称为委托者)将一些任务或职责传递给另一个对象(称为受托者),从而实现功能的扩展或复用。这种模式使得代码结构更加清晰,职责划分...

    C#中的委托的介绍,这是我自己的一些总结

    3. **使用委托**: 委托的实例化类似于类的实例化,但需要指定它将代理哪个方法。例如: ```csharp MyDelegate myDel = new MyDelegate(MyMethod); ``` 在这个例子中,`myDel`是一个`MyDelegate`类型的实例,它...

    C#中的委托和事件.doc

    委托 和 事件在 .Net ...本文中,将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。

    面试要回答的委托.pdf

    使用委托使程序员可以将方法引用封装在委托对象内。然后调用该委托对象就可以执行委托对象内方法引用指向的方法,而不必在编译时知道将调用哪个方法(如参数为委托类型的方法,也就是提供了为程序回调指定方法的机制...

Global site tag (gtag.js) - Google Analytics