C#事件基于委托
例1:只用于学习,理解事件底层原理,不推荐这么写;
例2:系统用的就是该方式,例如按钮的Click事件;
例3:最简略的写法,但是需要客户代码转换EventArgs;
1、事件声明完整格式范例:
//自定义事件参数,默认以EventArgs结尾,需要继承EventArgs类
public class MyEventArgs : EventArgs
{
public int ID { get; set; }
public string Name { get; set; }
}
//声明委托类型
public delegate void MyEventHandler(object sender, MyEventArgs e);
public class MyClass
{
//声明委托字段
private MyEventHandler myEventHandler;
//定义事件
public event MyEventHandler MyEvent
{
add
{
myEventHandler += value;
}
remove
{
myEventHandler -= value;
}
}
public void Action()
{
OnOrder(1, "jack");
}
//触发事件的方法一般命名为On???,并且不能是public,一般是protected,触发事件必须由对象自己触发,不能由外部触发
private void OnOrder(int id, string name)
{
if (myEventHandler != null)
{
MyEventArgs e = new MyEventArgs
{
ID = id,
Name = name
};
//触发事件
myEventHandler.Invoke(this, e);
}
}
}
2、事件声明简化格式范例:
//事件参数,默认以EventArgs结尾,需要继承EventArgs类
public class MyEventArgs : EventArgs
{
public int ID { get; set; }
public string Name { get; set; }
}
//声明委托类型
public delegate void MyEventHandler(object sender, MyEventArgs e);
public class MyClass
{
//定义事件
public event MyEventHandler MyEvent;
public void Action()
{
OnOrder(1, "jack");
}
//触发事件的方法一般命名为On???,并且不能是public,一般是protected,触发事件必须由对象自己触发,不能由外部触发
private void OnOrder(int id, string name)
{
if (MyEvent != null)
{
MyEventArgs e = new MyEventArgs
{
ID = id,
Name = name
};
//触发事件
MyEvent.Invoke(this, e);
}
}
}
3、事件声明通常不需要自定义委托类型,一般使用系统自带的EventHandler 类型
//事件参数,默认以EventArgs结尾,需要继承EventArgs类
public class OrderEventArgs : EventArgs
{
public int ID { get; set; }
public string Name { get; set; }
}
public class MyClass
{
//定义事件
public event EventHandler MyEvent;
public void Action()
{
OnOrder(1, "jack");
}
//触发事件的方法一般命名为On???,并且不能是public,一般是protected,触发事件必须由对象自己触发,不能由外部触发
private void OnOrder(int id, string name)
{
if (MyEvent != null)
{
OrderEventArgs e = new OrderEventArgs
{
ID = id,
Name = name
};
//触发事件
MyEvent.Invoke(this, e);
}
}
}