这是今天课堂上的一个话题。如何定义事件,这好像并不是问题,我们习惯性直接用下面的代码定义,不是吗?
class Customer {
public event EventHandler NameChanging;
}
这样做的话,大致是会怎么编译呢?
其实编译器会帮我们生成两个方法: add_NameChanging和remove_NameChanging
还会有一个字段,是EventHandler这个类型的 。
关键就在这里。它每次都会在创建对象的时候准备一个EventHandler,但问题是,并不是每个事件都会被用到。这就意味着,有一部分EventHandler其实是浪费的。
如果类型的事件很多,那么这个问题可能比较明显。
如何改进呢?
请参考下面的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Employee e = new Employee();
e.NameEvent += new EventHandler(e_NameEvent);
e.LNameEvent += new EventHandler(e_LNameEvent);
e.Name = "ares";
e.LName = "chen";
Console.Read();
}
static void e_LNameEvent(object sender, EventArgs e)
{
Employee emp = (Employee)sender;
Console.WriteLine(emp.LName);
}
static void e_NameEvent(object sender, EventArgs e)
{
Employee emp = (Employee)sender;
Console.WriteLine(emp.Name);
}
}
class Employee
{
private string name;
public string Name
{
get
{
return name;
}
set
{
name = value;
if (list[nameEventKey] != null)
list[nameEventKey].DynamicInvoke(new object[] { this, null });
}
}
private string lname;
public string LName
{
get
{
return lname;
}
set
{
lname = value;
if (list[lnameEventKey] != null)
list[lnameEventKey].DynamicInvoke(new object[] { this, null });
}
}
private EventHandlerList list = new EventHandlerList();
private object nameEventKey=null;
public event EventHandler NameEvent
{
add
{
if (nameEventKey == null)
nameEventKey = new object();
list.AddHandler(nameEventKey, value);
}
remove
{
if (nameEventKey == null)
nameEventKey = new object();
list.RemoveHandler(nameEventKey, value);
}
}
private object lnameEventKey=null;
public event EventHandler LNameEvent
{
add
{
if (lnameEventKey == null)
lnameEventKey = new object();
list.AddHandler(lnameEventKey, value);
}
remove
{
if (lnameEventKey == null)
lnameEventKey = new object();
list.RemoveHandler(lnameEventKey, value);
}
}
}
}