C # события, как их поднять? - PullRequest
2 голосов
/ 27 января 2011

Я пытаюсь научиться поднимать и обрабатывать события в 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 ]

9 голосов
/ 27 января 2011
public void onHit()
{
   if(BallInPlay != null)
     BallInPlay(this, new EventArgs());
}
4 голосов
/ 27 января 2011

Это просто, просто вызовите делегата напрямую, как в

BallInPlay(this, EventArgs.Empty);

Единственное, к чему вам нужно быть осторожным, это условие гонки, когда BallInPlay равен нулю или имеет значение null, прежде чем вызывать его.

Шаблон для работы с этим -

var bip = BallInPlay;
if (bip != null)
    bip(this, EventArgs.Empty);
0 голосов
/ 27 января 2011

Обычно, чтобы избежать тестирования обработчика каждый раз (как показал 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);
    }
}

На самом деле (хотя Джон Скит, вероятно, расскажет вам об этом до того, как я закончу писать этот пост :), единственный действительно безопасный поток событий - это вызов, обсуждаемый в статье Джона Скита .

Еще одна важная вещь, на которую следует обратить внимание, это то, что классы на самом деле не должны запускать события, которые находятся в других классах (т.е. метод OnHit не должен быть public). Если у класса есть публичное событие (например, BallClass), оно должно быть тем, которое инициирует это событие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...