[英]C# events, how to raise them?
我正在尝试学习在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?
}
}
在电话中我无法理解, 我该如何举起活动? 有任何想法吗?... :)
谢谢!
public void onHit()
{
if(BallInPlay != null)
BallInPlay(this, new EventArgs());
}
这很简单,只需直接调用委托,就像在
BallInPlay(this, EventArgs.Empty);
您唯一需要注意的是竞争条件,其中BallInPlay为null或在调用之前设置为null。
解决这个问题的模式是
var bip = BallInPlay;
if (bip != null)
bip(this, EventArgs.Empty);
通常,为了避免每次测试处理程序(如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的文章中讨论过的 。
您应该注意的另一个重要事项是,类不应该真正触发驻留在其他类中的事件(即OnHit
方法不应该是public
)。 如果一个类有一个公共事件(比如你的BallClass
),它就应该是一个触发这个事件的事件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.