1.事件的本质是什么
答:事件是委托的包装器,就像属性是字段的包装器一样
2.为什么有了委托还有有事件
委托可以被访问就可以被执行,事件则只能在类的内部执行
3.事件要怎么声明
a.明一个委托
//委托用于事件,约定以EventHandle结束 ,参数一般要有一个事件拥有者,和一个事件参数 ,这三者是同级的关系,所以三个类访问级别要一致
//为什么说三者呢,因为委托虽然写法比较怪,但也是一个类 public delegate void DelegateNameEventHandle(IHaveEvent obj,EventArgs e);
b.声明委托的参数类
//事件参数类要记得承继EventArgs这个系统的基类 public class DelegateNameEvenArgs:EventArgs { public int p1 { get; set; } }
c.声明拥有些事件的类
public class IHaveEvent { //简化的声明 public event DelegateNameEventHandle MySimpleEvent; //完整的声明 private DelegateNameEventHandle delegateNameEventHandle; public event DelegateNameEventHandle MyFullEvent { add { delegateNameEventHandle += value; } remove { delegateNameEventHandle -= value; } } }
4. .net 框架已经有一个 默认的 事件委托了 一般直接用就可以 不必自己声明
// // 摘要: // 表示将用于处理不具有事件数据的事件的方法。 // // 参数: // sender: // 事件源。 // // e: // 不包含事件数据的对象。 [ComVisible(true)] public delegate void EventHandler(object sender, EventArgs e);
5.既然事件只能由拥有者来执行,一般是如何操作的呢
//1 执行事件方法的访问级别不要让外部可以访问到,设成protected 此类的派生类也能访问 2 约定执行事件的方法命名on+事件名 protected void onEvnt(EventArgs e) { if (delegateNameEventHandle != null) { delegateNameEventHandle(this, e ); } }