C# 委托和事件
1.方法作为函数参数时使用委托作为其类型的声明
namespace normal
{
public class test
{
public delegate void SimpleDelegate(string m);
public void ShowMessage(string message)
{
Console.WriteLine(message);
}
public void UseDelegate(string message, SimpleDelegate showMessage)
{
showMessage(message);
}
}
class Program
{
static void Main(string[] args)
{
test t = new test();
t.UseDelegate("Delegate run!", t.ShowMessage);
Console.ReadKey();
}
}
}
2.方法绑定到委托
namespace normal
{
public class test
{
public delegate void SimpleDelegate(string m);
public void ShowMessage(string message)
{
Console.WriteLine("Message:" + message);
}
public void ShowTime(string time)
{
Console.WriteLine("Time:" + time);
}
public void UseDelegate(string message, SimpleDelegate showMessage)
{
showMessage(message);
}
}
class Program
{
static void Main(string[] args)
{
test t = new test();
test.SimpleDelegate d, d1, d2;
d1 = t.ShowMessage;//绑定方法
d2 = t.ShowTime;
t.UseDelegate("Delegate run!", d1);
t.UseDelegate(System.DateTime.Now.ToShortTimeString(), d2);
d = t.ShowMessage;//绑定多个方法,第一个方法必须用"="号赋值,后续方法用"+="
d += t.ShowTime;
t.UseDelegate("Delegate run!", d);//多个方法按照添加的顺序执行
d -= t.ShowMessage;//去除某个方法
t.UseDelegate("Delegate run!", d);
d("Direct use!");//直接调用
Console.ReadKey();
}
}
}
/* Output
Message:Delegate run!
Time:18:35
Message:Delegate run!
Time:Delegate run!
Time:Delegate run!
Time:Direct use!
*/
3.事件声明与绑定
namespace normal
{
public class test
{
public event SimpleDelegate EVENT;
public delegate void SimpleDelegate(string m);
public void ShowMessage(string message)
{
Console.WriteLine("Message:" + message);
}
public void ShowTime(string time)
{
Console.WriteLine("Time:" + time);
}
public void UseDelegate(string message)
{
EVENT(message);
}
}
class Program
{
static void Main(string[] args)
{
test t = new test();
t.EVENT += t.ShowMessage;
t.EVENT += t.ShowTime;
t.UseDelegate("Event run!");
Console.ReadKey();
}
}
}
事件使用委托来声明。
事件只能用”+= / -=”赋值。
它封装了委托类型的变量,使得在类的内部,不管你声明它是public还是protected,它总是private的。
声明一个事件类似于声明一个进行了封装的委托类型的变量。
4. .Net Framework中的委托与事件
委托类型的名称以EventHandler结束
委托类型的参数有两个分别是(object sender, EventArgs e)
参数EventArgs也可以是该类型的继承类
事件的命名是委托名称去掉EventHandler的部分
继承EventArgs的类名称以EventArgs结尾
namespace normal
{
class test
{
public string s = "I'm in test class!";
public delegate void ShowEventHandler(object sender, ShowEventArgs e);
public event ShowEventHandler Show;
public class ShowEventArgs : EventArgs
{
public readonly char s;
public ShowEventArgs(char param)
{
s = param;
}
}
public void WaitMessage()
{
char ch = 'A';
for (int i = 0; i < 10; i++)
{
Show(this, new ShowEventArgs(ch++));
Thread.Sleep(500);
}
}
}
class Display
{
public void ShowMessage(object sender, test.ShowEventArgs e)
{
test t = (test)sender;
Console.WriteLine(t.s + "\n" + e.s);
}
}
class Program
{
static void Main(string[] args)
{
test t = new test();
t.Show += (new Display()).ShowMessage;
t.WaitMessage();
Console.ReadKey();
}
}
}
/* Output
I'm in test class!
A
I'm in test class!
B
I'm in test class!
C
I'm in test class!
D
I'm in test class!
E
I'm in test class!
F
I'm in test class!
G
I'm in test class!
H
I'm in test class!
I
I'm in test class!
J
*/