Junior
Ի՞նչ են C#-ում իրադարձությունները։
sobes.tech AI
Պատասխան AI-ից
C#-ի իրադարձությունները մեխանիզմ են, որը հիմնված է "наблюдатель" (Observer Pattern) ձևանմուշի վրա, որը թույլ է տալիս օբյեկտին (հրատարակիչ) տեղեկացնել այլ օբյեկտներին (գրանցողներին) որոշ գործողության կամ վիճակի փոփոխության մասին:
Հիմնական բաղադրիչները՝
- Հրատարակիչ (Publisher): Կլաս, որը հայտարարում է իրադարձություն:
- Իրադարձություն (Event): Իրադարձության հայտարարում
eventբանալի բառի օգտագործմամբ: Սահմանում է մեթոդի սիգնատուրան, որը կօգտագործեն մշակողները: - Դելեգատ (Delegate): Տիպ, որը սահմանում է մեթոդների սիգնատուրան, որոնք կարող են գրանցվել իրադարձության վրա: Հաճախ օգտագործվում է նախապես սահմանված
EventHandlerկամEventHandler<TEventArgs>: - Գրանցող (Subscriber): Կլաս կամ օբյեկտ, որը գրանցվում է հրատարակչի իրադարձությանը և տրամադրում է մեթոդ (իրադարձության մշակող), որը կանչվում է իրադարձության ակտիվացման ժամանակ:
- Իրադարձության մշակող (Event Handler): Գրանցողի մեթոդ, որը համապատասխանում է իրադարձության դելեգատի սիգնատուրային:
Օրինակ հայտարարության և օգտագործման:
// Դելեգատի հայտարարում, եթե նախապես սահմանված `EventHandler`-ը չի օգտագործվում
public delegate void MyEventHandler(object sender, EventArgs e);
// Հրատարակչի կլաս
public class Publisher
{
// Իրադարձության հայտարարում դելեգատի օգտագործմամբ
public event MyEventHandler MyEvent;
public void DoSomething()
{
// Իրադարձության կանչում (եթե գրանցված են)
OnMyEvent(EventArgs.Empty);
}
// Մեթոդ իրադարձության կանչելու համար (պաշտպանված null-ից)
protected virtual void OnMyEvent(EventArgs e)
{
MyEvent?.Invoke(this, e);
}
}
// Գրանցողի կլաս
public class Subscriber
{
public void Subscribe(Publisher publisher)
{
// Գրանցում իրադարձությանը
publisher.MyEvent += HandleMyEvent;
}
public void Unsubscribe(Publisher publisher)
{
// Գրանցումից դուրս գալ
publisher.MyEvent -= HandleMyEvent;
}
// Իրադարձության մշակող
private void HandleMyEvent(object sender, EventArgs e)
{
Console.WriteLine("Իրադարձությունը տեղի ունեցավ!");
}
}
// Օրինակ օգտագործման
public class Program
{
public static void Main(string[] args)
{
Publisher pub = new Publisher();
Subscriber sub = new Subscriber();
sub.Subscribe(pub); // Գրանցում
pub.DoSomething(); // Իրադարձության կանչում
sub.Unsubscribe(pub); // Գրանցումից դուրս գալ (ընտրովի)
}
}
Իրադարձությունները ապահովում են թույլ կապ (loose coupling) օբյեկտների միջև, ինչը թույլ է տալիս նրանց համագործակցել առանց միմյանց իրականացման մասին ուղիղ գիտելիքի։