我正在尝试学习在C#中提升和处理事件。
这是我的简单例子:
/////////////// creating a new BALL object ///
ballClass ball = new ballClass();
void button1_Click(object sender, EventArgs e)
{
// this should make the BALL object raise an event
ball.onHit();
label1.Text = "EVENT SEND";
}
// when event is fired, label text should change
void BallInPlayEvent(object sender, EventArgs e)
{
label2.Text = "EVENT FOUND!";
}
和球类:
class ballClass
{
public event EventHandler BallInPlay;
public void onHit()
{
this.BallInPlay ///// ??? how should i raise this event?
}
}
在电话中我无法理解,如何举办活动?有什么想法?... :)
谢谢!
答案 0 :(得分:9)
public void onHit()
{
if(BallInPlay != null)
BallInPlay(this, new EventArgs());
}
答案 1 :(得分:4)
这很简单,只需直接调用委托,如
BallInPlay(this, EventArgs.Empty);
您唯一需要注意的是竞争条件,其中BallInPlay为null或在您调用之前设置为null。
处理的模式是
var bip = BallInPlay;
if (bip != null)
bip(this, EventArgs.Empty);
答案 2 :(得分:0)
通常,为避免每次测试处理程序(如Ed Guiness所示),(IMHO)更容易使用空委托简单地初始化事件,然后调用它而不检查:
class Ball
{
// add an empty delegate to our handler
public event EventHandler BallInPlay = delegate { };
protected virtual void OnHit(EventArgs e)
{
// no need to check, we have at least one
// dummy delegate in the invocation list
BallInPlay (this, e);
}
}
实际上(尽管Jon Skeet可能会在我写完这篇文章之前告诉你:),唯一真正的线程安全事件调用是在Jon Skeet's article中讨论的事件。
您应该注意的另一个重要事项是,类不应该真正触发驻留在其他类中的事件(即OnHit
方法不应该是public
)。如果一个类有一个公共事件(比如你的BallClass
),它就应该是一个触发此事件的事件。