Події в C # досить легкі, але, на мій погляд, документи MSDN роблять їх досить заплутаними. Зазвичай у більшості документації, яку ви бачите, обговорюється створення класу, що успадковується від EventArgs
базового класу, і для цього є причина . Однак це не найпростіший спосіб організовувати події, і для тих, хто хоче чогось швидкого та легкого, і в певний час використання Action
типу - це ваш квиток.
Створення подій та підписка на них
1. Створіть свою подію у своєму класі відразу після class
оголошення.
public event Action<string,string,string,string>MyEvent;
2. Створіть у своєму класі метод класу обробника подій.
private void MyEventHandler(string s1,string s2,string s3,string s4)
{
Console.WriteLine("{0} {1} {2} {3}",s1,s2,s3,s4);
}
3. Тепер, коли ваш клас викликається, скажіть йому підключити подію до нового обробника подій. Причиною, за якою використовується +=
оператор, є те, що ви додаєте до події свого конкретного обробника події. Ви можете насправді зробити це за допомогою декількох окремих обробників подій, і коли подію викликано, кожен обробник подій буде працювати в послідовності, в якій ви їх додали.
class Example
{
public Example()
{
MyEvent += new Action<string,string,string,string>(MyEventHandler);
}
}
4. Тепер, коли ви будете готові, запустіть (також підняти) подію десь у коді вашого класу приблизно так:
MyEvent("wow","this","is","cool");
Кінцевим результатом, коли ви запускаєте це, є те, що консоль видасть "вау це круто". І якщо ви змінили "круто" з датою або послідовністю та запустили тригер цієї події кілька разів, ви побачите, що результат виходить у послідовності FIFO, як події зазвичай повинні працювати.
У цьому прикладі я пройшов 4 рядки. Але ви можете змінити їх на будь-який прийнятний тип, або використати більш-менш типи, або навіть видалити <...>
out і нічого не передати своєму обробнику подій.
І знову ж таки, якби у вас було кілька власних обробників подій і ви підписали їх на свою подію разом з +=
оператором, тоді ваш тригер подій викликав би їх усіх послідовно.
Визначення тих, хто викликає події
Але що, якщо ви хочете ідентифікувати того, хто викликає цю подію, у своєму обробнику подій? Це корисно, якщо вам потрібен обробник події, який реагує на умови, засновані на тому, хто викликав / ініціював подію. Є кілька способів зробити це. Нижче наведено приклади, які показані в порядку їх швидкості роботи:
Варіант 1. (Найшвидший) Якщо ви це вже знаєте, передайте ім'я як буквальний рядок обробнику подій, коли його запускаєте.
Варіант 2. (Дещо швидко) Додайте це у свій клас і викличте його за допомогою методу виклику, а потім передайте цей рядок обробнику подій під час його запуску:
private static string GetCaller([System.Runtime.CompilerServices.CallerMemberName] string s = null) => s;
Варіант 3. (Найменш швидкий, але все-таки швидкий) У вашому обробнику подій, коли ви його запускаєте, отримайте рядок імені методу виклику з цим:
string callingMethod = new System.Diagnostics.StackTrace().GetFrame(1).GetMethod().ReflectedType.Name.Split('<', '>')[1];
Скасування підписки на події
Можливо, у вас є сценарій, коли ваша спеціальна подія має кілька обробників подій, але ви хочете видалити одну спеціальну зі списку обробників подій. Для цього використовуйте -=
оператор приблизно так:
MyEvent -= MyEventHandler;
Однак з цим слід сказати невелике застереження. Якщо ви зробите цю та ту подію, у якої більше немає обробників подій, і ви знову активуєте цю подію, це викличе виняток. (Винятки, звичайно, можна зафіксувати блоками try / catch.)
Видалення всіх подій
Гаразд, припустимо, ви закінчили з подіями і більше не хочете обробляти. Просто встановіть для нього нуль так:
MyEvent = null;
Така сама обережність щодо подій, що відмовляються від підписки, є і тут. Якщо у вашому користувальницькому обробнику подій більше немає жодних подій, і ви активуєте його знову, ваша програма видасть виняток.