События в C# или как сделать свой Event

Events – это события которые вызывает ваш класс, информируя тем самым своих подписчиков о том что произошло какое-то либо событие.
Если вам нужно передавать какие-либо параметры то кроме самого event’a вам нужно реализовать свой класс EventArgs через который вы и будете передавать параметры.

//создаем своей EventArgs.
public class TestEventArgs: EventArgs
{
public TestEventArgs(string s) { Text = s; }
public String Text {get; set;} 
}
public class Publisher
{
// создали делегат
public delegate void TestEventHandler(object sender, TestEventArgs e);
// объявили event
public event TestEventHandler TestEvent;
// функция вызова делегата
protected virtual void DoSomethingEvent()
{
if (TestEvent != null)
TestEvent(this, new TestEventArgs("Hi"));
}
}

 или

public class Publisher
{
	// объявили event
	public event EventHandler<TestEventArgs> TestEvent;
	// функция вызова делегата           
	protected virtual void DoSomethingEvent()
	{
		var handler = Interlocked.CompareExchange(ref this.TestEvent, null, null);

		if (handler != null)
		{
			handler(this, new TestEventArgs("Hi"));
		}
	}
}

Стоит упомянуть что  эту проверку надо делать обязательно. Она означает что у вас есть подписчики и есть кому отправлять событие.

if (TestEvent != null)
TestEvent(this, new TestEventArgs("Hi"));

А еще лучше вот так:

var handler = Interlocked.CompareExchange(ref this.TestEvent, null, null);

                if (handler != null)
                {
                    handler(this, new TestEventArgs("Hi"));
                }

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

Ну и в завершении, подписываться на события:

Test.TestEvent += new TestEventHandler();

Или так:

var handler = Volatile.Read(ref this.TestEvent);

                if (handler != null)
                {
                    handler(this, new TestEventArgs("Hi"));
                }

Или вот так, для C# 6:

Volatile.Read(ref this.TestEvent)?.Invoke(this, new TestEventArgs("Hi"));;

Или вот так, для C# 6:

Interlocked.CompareExchange(ref this.TestEvent, null, null)?.Invoke(this, new TestEventArgs("Hi"));

Отписывается от события:

Test.TestEvent -= new TestEventHandler();


Что почитать:
http://msdn.microsoft.com/ru-ru/library/8627sbea.aspx

https://habrahabr.ru/post/272571/

https://habrahabr.ru/post/240385/

Add comment