•定义事件依赖的委托,并定义事件以及引发事件的方法,该步骤可以定义在事件发布器类中
•定义事件所依赖的事件方法,该步骤可以定义在事件订阅者类中
•如果有事件参数,该步骤可以定义在事件参数类中
•注册事件并引发事件,该步骤一般写在主程序中
一般来讲在事件定义过程中,各个方法的命名没有统一的标准,但我们可以参考微软在c#中的命名规范进行命名
建议事件委托命名为:事件+EventHandler。如果有额外的参数传递需定义自己的参数类型,参数类型的命名规范 :事件+EventHandler。比如,可以定义一个事件委托 public delegate void calcEventHandler(object sender,calcEventArgs e); 。
定义一个事件变量如:public event calcEventHandler calc;
定义一个引发事件的方法如:public void onCalc(object sender,calcEventArgs e){}
建议方法名为 on+事件,就如同我们在开发web程序时,绑定的事件名有onClick,onLoad等一样。
参考看下面的例子,了解定义一个事件的一般过程,如果不需要传递事件的参数可以省去事件参数类的定义,使用系统预定义的EventArgs就可以了。
/// <summary>
/// 主程序类
/// </summary>
class Program
{
static void Main(string[] args)
{
eventPublish myEvent = new eventPublish();
eventSubscription myMethod = new eventSubscription();
//绑定方法 add 和 subtract,又称为对事件方法的注册 -=称为对事件方法的注销
myEvent.calc += myMethod.add;
myEvent.calc += myMethod.substract;
while (true)
{
try
{
Console.WriteLine("请输入第一个整数数");
int numA = Convert.ToInt16(Console.ReadLine());
Console.WriteLine("请输入第二个整数");
int numB = Convert.ToInt16(Console.ReadLine());
calcEventArgs e = new calcEventArgs(numA, numB);
//在本例不需要sender参数,随意传递了字符串"sender"
myEvent.onCalc("sender", e);
}
catch (Exception ex)
{
Console.WriteLine("出现错误," + ex.Message);
}
}
}
}
/// <summary>
/// 定义一个事件发布器类
/// </summary>
class eventPublish
{
//定义一个委托类型,委托名一般是 事件变量名+EventHandler
public delegate void calcEventHander(object sender,calcEventArgs e);
//定义一个事件变量,其变量名为calc
public event calcEventHander calc;
//封装事件,对外定义了引发事件的方法,定义的引发方法名一般是 on+事件变量名
public void onCalc(object sender, calcEventArgs e)
{
if (calc != null)
calc(sender,e);
}
}
/// <summary>
/// 定义一个事件订阅者类(事件方法类)
/// </summary>
class eventSubscription
{
public void add(object sender, calcEventArgs e)
{
Console.WriteLine("两数相加等于{0}", e.X + e.Y );
}
public void substract(object sender, calcEventArgs e)
{
Console.WriteLine("两数相减等于{0}", e.X - e.Y);
}
}
/// <summary>
/// 定义一个事件参数类
/// </summary>
class calcEventArgs : EventArgs
{
private int _x;
private int _y;
public calcEventArgs(int x, int y)
{
this._x = x;
this._y = y;
}
public int X
{
get { return _x; }
}
public int Y
{
get { return _y; }
}
}










