在MSDN中有如下对EventHandler委托的定义:表示将处理不包含事件数据的事件的方法并做下说明:
EventHandler 是一个预定义的委托,专用于表示不生成数据的事件的事件处理程序方法。如果事件生成数据,则必须提供自己的自定义事件数据类型,并且必须要么创建一个委托,其中第二个参数的类型为自定义类型,要么使用泛型 EventHandler<TEventArgs> 委托类并用自定义类型替代泛型类型参数。这里有些不解的是生成数据是指EventArgs的派生类包含了事件发行者的相关数据吗?下面的代码是否正确呢? public class BallEventArgs : EventArgs
{
public int Trajectory { get; private set; }
public int Distance { get; private set; }
public BallEventArgs(int Trajectory, int Distance)
{
........
}
} class Ball
{
public event EventHandler BallInPlay;
public void OnBallInPlay(BallEventArgs e
{
if (BallInPlay != null)
BallInPlay(this , e);
}
} class Pitcher
{
public Pitcher(Ball ball)
{
ball.BallInPlay += new EventHandler(ball_BallInPlay);
} void ball_BallInPlay(object sender, EventArgs e)
{
...........
}
}
EventHandler 是一个预定义的委托,专用于表示不生成数据的事件的事件处理程序方法。如果事件生成数据,则必须提供自己的自定义事件数据类型,并且必须要么创建一个委托,其中第二个参数的类型为自定义类型,要么使用泛型 EventHandler<TEventArgs> 委托类并用自定义类型替代泛型类型参数。这里有些不解的是生成数据是指EventArgs的派生类包含了事件发行者的相关数据吗?下面的代码是否正确呢? public class BallEventArgs : EventArgs
{
public int Trajectory { get; private set; }
public int Distance { get; private set; }
public BallEventArgs(int Trajectory, int Distance)
{
........
}
} class Ball
{
public event EventHandler BallInPlay;
public void OnBallInPlay(BallEventArgs e
{
if (BallInPlay != null)
BallInPlay(this , e);
}
} class Pitcher
{
public Pitcher(Ball ball)
{
ball.BallInPlay += new EventHandler(ball_BallInPlay);
} void ball_BallInPlay(object sender, EventArgs e)
{
...........
}
}
解决方案 »
- c# 修改硬盘逻辑序列号有朋友会的吗?
- vs2010 安装和部署 visual studio installer 安装程序
- 软件设计中涉及的财务知识
- 网络图片上传图片路径设置问题??????!!!!!100分求答案!!!!!!!!!!!!!!!!!!!!!!!!
- c#读取Excel 求解 谢谢各位啦
- 不给分就没人回答哦 什么世道呀 我都没分了。。。
- C#如何读取autocad中的BOM表
- C#事件同步问题请教,急,请各位大牛指导
- C#中使用SoundRecord()录音,如何实时显示录音的波形
- GDI+图象操作问题,有一定难度,各位专家请进!
- c# 手机号码归属地查询
- 我们对软件进行了加密,用英语怎么说?谢谢。
EventHandler<TEventArgs> 而不是EventHandlerpublic event EventHandler BallInPlay; -》 public event EventHandler<BallEventArgs> BallInPlay;void ball_BallInPlay(object sender, EventArgs e)
{
...........
}
void ball_BallInPlay(object sender, BallEventArgs e)
{
...........
}
的意思EventHandler 是一个预定义的委托,专用于表示不生成数据的事件的事件处理程序方法。如果事件生成数据,则必须提供自己的自定义事件数据类型,并且必须要么创建一个委托,其中第二个参数的类型为自定义类型,要么使用泛型 EventHandler<TEventArgs> 委托类并用自定义类型替代泛型类型参数。
{
if (e is MyEventArgs )
{
MyEventArgs myEventArgs = e as MyEventArgs;
}
}
void ball_BallInPlay(object sender, EventArgs e)
{
...........
}
}
应为参数是EventArgs ,所以不能获取到事件传递出来参数值,比如Trajectory 和Distance ,当然你写的代码倒是可以把EventArgs 强制转换成BallEventArgs ,不过如果这个事件你是给别人用的,人家怎么知道EventArgs 实际上是BallEventArgs 。
表示将处理不包含事件数据的事件的方法这个给你举个例子吧,加入你在做一个状态改变的事件,一般在使用这个事件的人通常希望知道改变前的状态和改变后的状态都是什么,你怎么给他这两个状态呢?做法就是声明一个继承EventArgs 类,在这个类里面加上2个属性改变前后的状态,并在触发事件代码里面复制,这样消费你的事件的人就可以知道改变前后的状态了。
但有些事件是不需要传递任何值的,比如点击按钮事件,这个直接用EventArgs 好了。建议你看看在没有泛型EventHandler强怎么声明自定义参数事件肯能对你理解这个更有好处。