C#事件,如何提高它们?

时间:2011-01-27 16:15:17

标签: c# events

我正在尝试学习在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?
    }
}

在电话中我无法理解,如何举办活动?有什么想法?... :)

谢谢!

3 个答案:

答案 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),它就应该是一个触发此事件的事件。