繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM