为什么用委托
Posted zjone391
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么用委托相关的知识,希望对你有一定的参考价值。
刚学习委托时无论老师怎么开导,我都是一头雾水,不是听不懂,也不是不会写,就是不明白为什么要用委托,看不出来一点好处,而且写很多没用的代码,每当这么问老师时,老师总说:用委托会使你的代码更灵活,我的天啊,和没说一样,后来参加工作了两年竟然一直没有用到委托也没什么觉得不妥,直到有一天看到了张子阳的“事件和委托”让我大吃一惊研读了几天终于弄懂了一点事件和委托,这时突然感觉以前写的程序都不是程序,起码不是面向对象的程序,因为事件和委托是面向对象编程精髓。
上几天一个同事问我什么是委托,我告诉他:“委托是方法的指针,可以把方法当参数用......,懂么?”,他说懂了。他又问我为啥要用委托不用不行么我依然可以实现委托能实现的任何功能,这时我想像我老师一样的告诉他,他肯定会和我一样迷糊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()
{
//写数据库
}
}
public
class
Timer
{
public
static
void
start(
int
sleep, ? doSomething)
{
}
}
{
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();
}
}
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;
}
以上是关于为什么用委托的主要内容,如果未能解决你的问题,请参考以下文章