刚学习委托时无论老师怎么开导,我都是一头雾水,不是听不懂,也不是不会写,就是不明白为什么要用委托,看啊不出来一点好处,而且写很多没用的代码,每当这么问老师时,老师总说:用委托会使你的代码更灵活,我的天啊,和没说一样,后来参加工作了两年竟然一直没有用到委托也没什么觉得不妥,直到有一天看到了张子阳的“事件和委托”让我大吃一惊研读了几天终于弄懂了一点事件和委托,这时突然感觉以前写的程序都不是程序,起码不是面向对象的程序,因为事件和委托是面向对象编程精髓。
上几天一个同事问我什么是委托,我告诉他:“委托是方法的指针,可以把方法当参数用......,懂么?”,他说懂了。他又问我为啥要用委托不用不行么我依然可以实现委托能实现的任何功能,这时我想像我老师一样的告诉他,他肯定会和我一样迷糊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);
}
}
///
<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
分享到:
相关推荐
委托 和 事件在 .Net Framework中的应用...本文中,将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。
委托 和 事件在 .Net ...本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。
委托 和 事件在 .Net ...本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。
为什么要使用委托? 委托的主要作用是将方法作为参数传递给其他方法,或者将方法作为返回值返回给其他方法。这使得我们的代码更加灵活和可扩展。例如,在我们之前的例子中,我们可以将`EnglishGreeting`和`...
委托 和 事件在 .Net Framework 中...将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework 中的委托和事件、委托和事件对 Observer 设计模式的意义,对它们的中间代码也做了讨论。
委托 和 事件在 .Net Framework中的...本文中,我将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。
本教程将深入探讨如何使用委托来实现在多个窗体间的值传递。 首先,我们需要理解什么是委托。在C#中,委托是类型安全的函数指针,它定义了一种调用方法的签名。通过声明委托类型,我们可以创建一个对象,该对象可以...
C#中的委托相当于C++中的函数指针,也就说两者是有区别的:委托是面向对象的,类型安全的,是引用类型(开始就说了委托是个类),所以在使用委托时首先要 定义——>声明——>实例化——>作为参数传递给方法——>使用...
"使用委托进行窗体间传值"是一种高效且灵活的方法,它利用了C#中的事件处理机制和委托的概念。下面我们将深入探讨这个主题。 首先,我们需要理解什么是委托。在C#中,委托是类型安全的函数指针,可以引用一个或多个...
在使用委托时,需要将委托实例化,并将其指向要调用的方法。 事件是 C# 中另一个重要的概念,它可以在对象之间进行通信。事件可以看作是一个委托的集合,事件的发布者可以将事件发布给订阅者,订阅者可以对事件进行...
首先,让我们了解什么是委托。在C#中,委托类似于函数指针,但它更安全,类型安全,支持多播(即一个委托实例可以引用多个方法)。委托是引用类型,有自己的类型系统,定义了方法的签名,确保传递的方法具有兼容的...
如果下面两个条件都为真,则方法和委托类型是兼容的:(兼容的概念就是可以用此声明的委托对方法进行委托). 1它们具有相同的参数数目,并且类型相同,顺序相同,参数修饰符也相同。 2它们的返回类型相同。
委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解...本文将通过范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义...
本示例将深入探讨如何使用委托和事件,以及它们在实际编程中的应用。 首先,我们来了解什么是委托。委托在.NET中可以看作是类型安全的方法指针,它允许我们将一个或多个方法引用存储在变量中,然后在后续的代码中像...
首先,我们要理解什么是委托。在软件工程中,委托是一种设计模式,其中一个对象(称为委托者)将一些任务或职责传递给另一个对象(称为受托者),从而实现功能的扩展或复用。这种模式使得代码结构更加清晰,职责划分...
3. **使用委托**: 委托的实例化类似于类的实例化,但需要指定它将代理哪个方法。例如: ```csharp MyDelegate myDel = new MyDelegate(MyMethod); ``` 在这个例子中,`myDel`是一个`MyDelegate`类型的实例,它...
委托 和 事件在 .Net ...本文中,将通过两个范例由浅入深地讲述什么是委托、为什么要使用委托、事件的由来、.Net Framework中的委托和事件、委托和事件对Observer设计模式的意义,对它们的中间代码也做了讨论。