مدیریت رویداد در سی شارپ
Summarize this content to 400 words in Persian Lang در سی شارپ رویدادها یک ویژگی قدرتمند هستند که به اشیا اجازه می دهد با یکدیگر ارتباط برقرار کنند. رویدادها بر اساس الگوی ناظر، جایی که یک شی (موضوع) به اشیاء دیگر (ناظران) هنگامی که مورد علاقه رخ می دهد اطلاع می دهد. رویدادها در سی شارپ معمولاً با استفاده از آن پیادهسازی میشوند نمایندگان، که انواعی هستند که ارجاع به روش هایی را با امضای خاص نشان می دهند.
در اینجا یک تفکیک عمیق از تمام راه های ممکن برای ایجاد و استفاده از رویدادها در سی شارپ، از جمله نمونه هایی با اقدام، تابع، و نمایندگان سفارشی.
1. با استفاده از EventHandler Delegate
رایج ترین راه برای اعلام یک رویداد در سی شارپ استفاده از عبارت است EventHandler نمایندگی یا EventHandler<TEventArgs>، که به دنبال یک امضای خاص است.
مثال:
public class EventPublisher
{
// Event based on the built-in EventHandler delegate
public event EventHandler EventOccured;
public void TriggerEvent()
{
// Check if there are any subscribers
EventOccured?.Invoke(this, EventArgs.Empty);
}
}
public class EventSubscriber
{
public void OnEventOccured(object sender, EventArgs e)
{
Console.WriteLine(“Event has occurred!”);
}
}
class Program
{
static void Main(string[] args)
{
EventPublisher publisher = new EventPublisher();
EventSubscriber subscriber = new EventSubscriber();
// Subscribe to the event
publisher.EventOccured += subscriber.OnEventOccured;
// Trigger the event
publisher.TriggerEvent();
}
}
اینجا، EventHandler یک نماینده از پیش تعریف شده با امضایی است که دو پارامتر دارد: فرستنده (از نوع object) و یک EventArgs (یا نوع مشتق شده).
2. استفاده از EventHandler با سفارشی EventArgs
شما می توانید یک کلاس سفارشی مشتق شده از آن تعریف کنید EventArgs برای انتقال اطلاعات بیشتر هنگام راه اندازی رویداد.
مثال:
public class CustomEventArgs : EventArgs
{
public string Message { get; }
public CustomEventArgs(string message)
{
Message = message;
}
}
public class EventPublisher
{
public event EventHandler<CustomEventArgs> EventOccured;
public void TriggerEvent(string message)
{
EventOccured?.Invoke(this, new CustomEventArgs(message));
}
}
public class EventSubscriber
{
public void OnEventOccured(object sender, CustomEventArgs e)
{
Console.WriteLine($”Event message: {e.Message}”);
}
}
class Program
{
static void Main(string[] args)
{
EventPublisher publisher = new EventPublisher();
EventSubscriber subscriber = new EventSubscriber();
publisher.EventOccured += subscriber.OnEventOccured;
publisher.TriggerEvent(“Hello from the event!”);
}
}
اینجا، CustomEventArgs حاوی داده های اضافی (Message) به گردانندگان رویداد منتقل شد.
3. استفاده از نمایندگی سفارشی
به جای استفاده از از پیش تعریف شده EventHandler، می توانید نماینده خود را برای تعریف یک امضای رویداد سفارشی ایجاد کنید.
مثال:
public delegate void CustomEventDelegate(string message);
public class EventPublisher
{
public event CustomEventDelegate EventOccured;
public void TriggerEvent(string message)
{
EventOccured?.Invoke(message);
}
}
public class EventSubscriber
{
public void OnEventOccured(string message)
{
Console.WriteLine($”Event message: {message}”);
}
}
class Program
{
static void Main(string[] args)
{
EventPublisher publisher = new EventPublisher();
EventSubscriber subscriber = new EventSubscriber();
publisher.EventOccured += subscriber.OnEventOccured;
publisher.TriggerEvent(“Hello from the custom delegate event!”);
}
}
4. با استفاده از Action Delegate
را Action delegate بخشی از چارچوب دات نت است و روشی را نشان می دهد که ارزش بازگشتی ندارد. می تواند پارامترهایی را بگیرد که آن را برای رویدادها مناسب می کند.
مثال:
public class EventPublisher
{
public event Action<string> EventOccured;
public void TriggerEvent(string message)
{
EventOccured?.Invoke(message);
}
}
public class EventSubscriber
{
public void OnEventOccured(string message)
{
Console.WriteLine($”Action Event message: {message}”);
}
}
class Program
{
static void Main(string[] args)
{
EventPublisher publisher = new EventPublisher();
EventSubscriber subscriber = new EventSubscriber();
publisher.EventOccured += subscriber.OnEventOccured;
publisher.TriggerEvent(“Hello from Action-based event!”);
}
}
اینجا، Action<string> delegate استفاده می شود که یک پارامتر را می گیرد و برمی گرداند void.
5. استفاده از Func Delegate
را Func delegate روشی را نشان می دهد که مقداری را برمی گرداند. اگرچه کمتر اتفاق می افتد که رویدادها مقادیر را برگردانند (از آنجایی که رویدادها معمولاً شنوندگان را مطلع می کنند، نه درخواست بازخورد)، می توانید از Func برای طراحی رویدادی که انتظار یک مقدار بازگشتی را دارد.
مثال:
public class EventPublisher
{
public event Func<string, bool> EventOccured;
public void TriggerEvent(string message)
{
bool result = EventOccured?.Invoke(message) ?? false;
Console.WriteLine($”Event result: {result}”);
}
}
public class EventSubscriber
{
public bool OnEventOccured(string message)
{
Console.WriteLine($”Func Event message: {message}”);
return message.Contains(“success”);
}
}
class Program
{
static void Main(string[] args)
{
EventPublisher publisher = new EventPublisher();
EventSubscriber subscriber = new EventSubscriber();
publisher.EventOccured += subscriber.OnEventOccured;
publisher.TriggerEvent(“Hello with success!”);
}
}
اینجا، Func<string, bool> رویدادی را تعریف می کند که a را برمی گرداند bool بر اساس پیام ارسال شده
6. روشهای ناشناس برای مدیریت رویداد
همچنین میتوانید با استفاده از روشهای ناشناس یا عبارات لامبدا در رویدادها مشترک شوید.
مثال:
public class EventPublisher
{
public event EventHandler EventOccured;
public void TriggerEvent()
{
EventOccured?.Invoke(this, EventArgs.Empty);
}
}
class Program
{
static void Main(string[] args)
{
EventPublisher publisher = new EventPublisher();
// Subscribe with an anonymous method
publisher.EventOccured += delegate (object sender, EventArgs e)
{
Console.WriteLine(“Event handled using anonymous method”);
};
// Subscribe with a lambda expression
publisher.EventOccured += (sender, e) =>
{
Console.WriteLine(“Event handled using lambda expression”);
};
publisher.TriggerEvent();
}
}
در این مورد، کنترل کننده رویداد با استفاده از روش های ناشناس یا عبارات لامبدا به صورت درون خطی مشخص می شود.
7. مدیریت صریح رویداد با استفاده از رابط
شما می توانید رویدادها را به صراحت به عنوان بخشی از یک رابط تعریف کنید، و کلاس هایی که این رابط را پیاده سازی می کنند می توانند مدیریت رویداد را ارائه دهند.
مثال:
public interface IEventPublisher
{
event EventHandler EventOccured;
}
public class EventPublisher : IEventPublisher
{
public event EventHandler EventOccured;
public void TriggerEvent()
{
EventOccured?.Invoke(this, EventArgs.Empty);
}
}
public class EventSubscriber
{
public void OnEventOccured(object sender, EventArgs e)
{
Console.WriteLine(“Event handled from interface”);
}
}
class Program
{
static void Main(string[] args)
{
EventPublisher publisher = new EventPublisher();
EventSubscriber subscriber = new EventSubscriber();
IEventPublisher iPublisher = publisher;
iPublisher.EventOccured += subscriber.OnEventOccured;
publisher.TriggerEvent();
}
}
در این مثال، IEventPublisher اینترفیس رویداد و کلاسهای مشابه را تعریف میکند EventPublisher باید آن را اجرا کند.
8. نمایندگان چند بازیگری و رویدادها
رویدادهای سی شارپ میتوانند چند پخشی باشند، به این معنی که چندین روش را میتوان در پاسخ به یک راهانداز رویداد فراخوانی کرد.
مثال:
public class EventPublisher
{
public event Action<string> EventOccured;
public void TriggerEvent(string message)
{
EventOccured?.Invoke(message);
}
}
public class EventSubscriber
{
public void FirstHandler(string message)
{
Console.WriteLine($”First handler: {message}”);
}
public void SecondHandler(string message)
{
Console.WriteLine($”Second handler: {message}”);
}
}
class Program
{
static void Main(string[] args)
{
EventPublisher publisher = new EventPublisher();
EventSubscriber subscriber = new EventSubscriber();
publisher.EventOccured += subscriber.FirstHandler;
publisher.EventOccured += subscriber.SecondHandler;
publisher.TriggerEvent(“Hello to multiple handlers!”);
}
}
اینجا، هر دو FirstHandler و SecondHandler هنگامی که رویداد راه اندازی می شود، فراخوانی می شوند.
اینها رایج ترین راه ها برای ایجاد و مدیریت رویدادها در سی شارپ هستند. این که آیا با استفاده از نمایندگان داخلی مانند Action، Func، یا EventHandler، یا ایجاد موارد سفارشی، رویدادها به شما امکان می دهند سیستم های قوی و جدا شده بسازید.
اجازه دهید با اجرای نهایی خلاصه کنیم
using System;
public class EventExamples
{
// 1. Traditional event declaration with custom EventArgs
public class CustomEventArgs : EventArgs
{
public string Message { get; set; }
}
public event EventHandler<CustomEventArgs> TraditionalEvent;
// 2. Event using Action delegate
public event Action SimpleEvent;
// 3. Event using Action<T> delegate
public event Action<string> ParameterizedEvent;
// 4. Event using Func<T, TResult> delegate
public event Func<string, bool> FuncEvent;
// 5. Custom delegate event
public delegate void CustomDelegate(string message, int number);
public event CustomDelegate CustomEvent;
// 6. Event with multiple parameters using Action
public event Action<string, int, bool> MultiParamEvent;
// Methods to raise the events
public void RaiseTraditionalEvent(string message)
{
TraditionalEvent?.Invoke(this, new CustomEventArgs { Message = message });
}
public void RaiseSimpleEvent()
{
SimpleEvent?.Invoke();
}
public void RaiseParameterizedEvent(string message)
{
ParameterizedEvent?.Invoke(message);
}
public bool RaiseFuncEvent(string input)
{
return FuncEvent?.Invoke(input) ?? false;
}
public void RaiseCustomEvent(string message, int number)
{
CustomEvent?.Invoke(message, number);
}
public void RaiseMultiParamEvent(string message, int number, bool flag)
{
MultiParamEvent?.Invoke(message, number, flag);
}
}
// Usage example
class Program
{
static void Main()
{
var examples = new EventExamples();
// Subscribe to events
examples.TraditionalEvent += (sender, e) => Console.WriteLine($”Traditional event: {e.Message}”);
examples.SimpleEvent += () => Console.WriteLine(“Simple event fired”);
examples.ParameterizedEvent += message => Console.WriteLine($”Parameterized event: {message}”);
examples.FuncEvent += input => { Console.WriteLine($”Func event: {input}”); return true; };
examples.CustomEvent += (message, number) => Console.WriteLine($”Custom event: {message}, {number}”);
examples.MultiParamEvent += (message, number, flag) => Console.WriteLine($”Multi-param event: {message}, {number}, {flag}”);
// Raise events
examples.RaiseTraditionalEvent(“Hello, World!”);
examples.RaiseSimpleEvent();
examples.RaiseParameterizedEvent(“Event with parameter”);
bool result = examples.RaiseFuncEvent(“Func event input”);
examples.RaiseCustomEvent(“Custom message”, 42);
examples.RaiseMultiParamEvent(“Multi-param”, 100, true);
}
}
در اینجا توضیح مختصری در مورد هر روش آورده شده است:
رویداد سنتی: موارد استفاده EventHandler<T> با سفارشی EventArgs.
رویداد ساده: موارد استفاده Action نمایندگی برای رویدادهای بدون پارامتر
رویداد پارامتری شده: موارد استفاده Action<T> برای رویدادهایی با یک پارامتر
رویداد Func: موارد استفاده Func<T, TResult> برای رویدادهایی که مقداری را برمی گرداند.
رویداد نمایندگی سفارشی: یک نماینده سفارشی برای امضاهای رویداد پیچیده تر تعریف می کند.
رویداد چند پارامتری: موارد استفاده Action<T1, T2, T3> برای رویدادهایی با چندین پارامتر
در سی شارپ رویدادها یک ویژگی قدرتمند هستند که به اشیا اجازه می دهد با یکدیگر ارتباط برقرار کنند. رویدادها بر اساس الگوی ناظر، جایی که یک شی (موضوع) به اشیاء دیگر (ناظران) هنگامی که مورد علاقه رخ می دهد اطلاع می دهد. رویدادها در سی شارپ معمولاً با استفاده از آن پیادهسازی میشوند نمایندگان، که انواعی هستند که ارجاع به روش هایی را با امضای خاص نشان می دهند.
در اینجا یک تفکیک عمیق از تمام راه های ممکن برای ایجاد و استفاده از رویدادها در سی شارپ، از جمله نمونه هایی با اقدام، تابع، و نمایندگان سفارشی.
1. با استفاده از EventHandler Delegate
رایج ترین راه برای اعلام یک رویداد در سی شارپ استفاده از عبارت است EventHandler
نمایندگی یا EventHandler<TEventArgs>
، که به دنبال یک امضای خاص است.
مثال:
public class EventPublisher
{
// Event based on the built-in EventHandler delegate
public event EventHandler EventOccured;
public void TriggerEvent()
{
// Check if there are any subscribers
EventOccured?.Invoke(this, EventArgs.Empty);
}
}
public class EventSubscriber
{
public void OnEventOccured(object sender, EventArgs e)
{
Console.WriteLine("Event has occurred!");
}
}
class Program
{
static void Main(string[] args)
{
EventPublisher publisher = new EventPublisher();
EventSubscriber subscriber = new EventSubscriber();
// Subscribe to the event
publisher.EventOccured += subscriber.OnEventOccured;
// Trigger the event
publisher.TriggerEvent();
}
}
اینجا، EventHandler
یک نماینده از پیش تعریف شده با امضایی است که دو پارامتر دارد: فرستنده (از نوع object
) و یک EventArgs
(یا نوع مشتق شده).
2. استفاده از EventHandler با سفارشی EventArgs
شما می توانید یک کلاس سفارشی مشتق شده از آن تعریف کنید EventArgs
برای انتقال اطلاعات بیشتر هنگام راه اندازی رویداد.
مثال:
public class CustomEventArgs : EventArgs
{
public string Message { get; }
public CustomEventArgs(string message)
{
Message = message;
}
}
public class EventPublisher
{
public event EventHandler<CustomEventArgs> EventOccured;
public void TriggerEvent(string message)
{
EventOccured?.Invoke(this, new CustomEventArgs(message));
}
}
public class EventSubscriber
{
public void OnEventOccured(object sender, CustomEventArgs e)
{
Console.WriteLine($"Event message: {e.Message}");
}
}
class Program
{
static void Main(string[] args)
{
EventPublisher publisher = new EventPublisher();
EventSubscriber subscriber = new EventSubscriber();
publisher.EventOccured += subscriber.OnEventOccured;
publisher.TriggerEvent("Hello from the event!");
}
}
اینجا، CustomEventArgs
حاوی داده های اضافی (Message
) به گردانندگان رویداد منتقل شد.
3. استفاده از نمایندگی سفارشی
به جای استفاده از از پیش تعریف شده EventHandler
، می توانید نماینده خود را برای تعریف یک امضای رویداد سفارشی ایجاد کنید.
مثال:
public delegate void CustomEventDelegate(string message);
public class EventPublisher
{
public event CustomEventDelegate EventOccured;
public void TriggerEvent(string message)
{
EventOccured?.Invoke(message);
}
}
public class EventSubscriber
{
public void OnEventOccured(string message)
{
Console.WriteLine($"Event message: {message}");
}
}
class Program
{
static void Main(string[] args)
{
EventPublisher publisher = new EventPublisher();
EventSubscriber subscriber = new EventSubscriber();
publisher.EventOccured += subscriber.OnEventOccured;
publisher.TriggerEvent("Hello from the custom delegate event!");
}
}
4. با استفاده از Action Delegate
را Action
delegate بخشی از چارچوب دات نت است و روشی را نشان می دهد که ارزش بازگشتی ندارد. می تواند پارامترهایی را بگیرد که آن را برای رویدادها مناسب می کند.
مثال:
public class EventPublisher
{
public event Action<string> EventOccured;
public void TriggerEvent(string message)
{
EventOccured?.Invoke(message);
}
}
public class EventSubscriber
{
public void OnEventOccured(string message)
{
Console.WriteLine($"Action Event message: {message}");
}
}
class Program
{
static void Main(string[] args)
{
EventPublisher publisher = new EventPublisher();
EventSubscriber subscriber = new EventSubscriber();
publisher.EventOccured += subscriber.OnEventOccured;
publisher.TriggerEvent("Hello from Action-based event!");
}
}
اینجا، Action<string>
delegate استفاده می شود که یک پارامتر را می گیرد و برمی گرداند void
.
5. استفاده از Func Delegate
را Func
delegate روشی را نشان می دهد که مقداری را برمی گرداند. اگرچه کمتر اتفاق می افتد که رویدادها مقادیر را برگردانند (از آنجایی که رویدادها معمولاً شنوندگان را مطلع می کنند، نه درخواست بازخورد)، می توانید از Func
برای طراحی رویدادی که انتظار یک مقدار بازگشتی را دارد.
مثال:
public class EventPublisher
{
public event Func<string, bool> EventOccured;
public void TriggerEvent(string message)
{
bool result = EventOccured?.Invoke(message) ?? false;
Console.WriteLine($"Event result: {result}");
}
}
public class EventSubscriber
{
public bool OnEventOccured(string message)
{
Console.WriteLine($"Func Event message: {message}");
return message.Contains("success");
}
}
class Program
{
static void Main(string[] args)
{
EventPublisher publisher = new EventPublisher();
EventSubscriber subscriber = new EventSubscriber();
publisher.EventOccured += subscriber.OnEventOccured;
publisher.TriggerEvent("Hello with success!");
}
}
اینجا، Func<string, bool>
رویدادی را تعریف می کند که a را برمی گرداند bool
بر اساس پیام ارسال شده
6. روشهای ناشناس برای مدیریت رویداد
همچنین میتوانید با استفاده از روشهای ناشناس یا عبارات لامبدا در رویدادها مشترک شوید.
مثال:
public class EventPublisher
{
public event EventHandler EventOccured;
public void TriggerEvent()
{
EventOccured?.Invoke(this, EventArgs.Empty);
}
}
class Program
{
static void Main(string[] args)
{
EventPublisher publisher = new EventPublisher();
// Subscribe with an anonymous method
publisher.EventOccured += delegate (object sender, EventArgs e)
{
Console.WriteLine("Event handled using anonymous method");
};
// Subscribe with a lambda expression
publisher.EventOccured += (sender, e) =>
{
Console.WriteLine("Event handled using lambda expression");
};
publisher.TriggerEvent();
}
}
در این مورد، کنترل کننده رویداد با استفاده از روش های ناشناس یا عبارات لامبدا به صورت درون خطی مشخص می شود.
7. مدیریت صریح رویداد با استفاده از رابط
شما می توانید رویدادها را به صراحت به عنوان بخشی از یک رابط تعریف کنید، و کلاس هایی که این رابط را پیاده سازی می کنند می توانند مدیریت رویداد را ارائه دهند.
مثال:
public interface IEventPublisher
{
event EventHandler EventOccured;
}
public class EventPublisher : IEventPublisher
{
public event EventHandler EventOccured;
public void TriggerEvent()
{
EventOccured?.Invoke(this, EventArgs.Empty);
}
}
public class EventSubscriber
{
public void OnEventOccured(object sender, EventArgs e)
{
Console.WriteLine("Event handled from interface");
}
}
class Program
{
static void Main(string[] args)
{
EventPublisher publisher = new EventPublisher();
EventSubscriber subscriber = new EventSubscriber();
IEventPublisher iPublisher = publisher;
iPublisher.EventOccured += subscriber.OnEventOccured;
publisher.TriggerEvent();
}
}
در این مثال، IEventPublisher
اینترفیس رویداد و کلاسهای مشابه را تعریف میکند EventPublisher
باید آن را اجرا کند.
8. نمایندگان چند بازیگری و رویدادها
رویدادهای سی شارپ میتوانند چند پخشی باشند، به این معنی که چندین روش را میتوان در پاسخ به یک راهانداز رویداد فراخوانی کرد.
مثال:
public class EventPublisher
{
public event Action<string> EventOccured;
public void TriggerEvent(string message)
{
EventOccured?.Invoke(message);
}
}
public class EventSubscriber
{
public void FirstHandler(string message)
{
Console.WriteLine($"First handler: {message}");
}
public void SecondHandler(string message)
{
Console.WriteLine($"Second handler: {message}");
}
}
class Program
{
static void Main(string[] args)
{
EventPublisher publisher = new EventPublisher();
EventSubscriber subscriber = new EventSubscriber();
publisher.EventOccured += subscriber.FirstHandler;
publisher.EventOccured += subscriber.SecondHandler;
publisher.TriggerEvent("Hello to multiple handlers!");
}
}
اینجا، هر دو FirstHandler
و SecondHandler
هنگامی که رویداد راه اندازی می شود، فراخوانی می شوند.
اینها رایج ترین راه ها برای ایجاد و مدیریت رویدادها در سی شارپ هستند. این که آیا با استفاده از نمایندگان داخلی مانند Action
، Func
، یا EventHandler
، یا ایجاد موارد سفارشی، رویدادها به شما امکان می دهند سیستم های قوی و جدا شده بسازید.
اجازه دهید با اجرای نهایی خلاصه کنیم
using System;
public class EventExamples
{
// 1. Traditional event declaration with custom EventArgs
public class CustomEventArgs : EventArgs
{
public string Message { get; set; }
}
public event EventHandler<CustomEventArgs> TraditionalEvent;
// 2. Event using Action delegate
public event Action SimpleEvent;
// 3. Event using Action<T> delegate
public event Action<string> ParameterizedEvent;
// 4. Event using Func<T, TResult> delegate
public event Func<string, bool> FuncEvent;
// 5. Custom delegate event
public delegate void CustomDelegate(string message, int number);
public event CustomDelegate CustomEvent;
// 6. Event with multiple parameters using Action
public event Action<string, int, bool> MultiParamEvent;
// Methods to raise the events
public void RaiseTraditionalEvent(string message)
{
TraditionalEvent?.Invoke(this, new CustomEventArgs { Message = message });
}
public void RaiseSimpleEvent()
{
SimpleEvent?.Invoke();
}
public void RaiseParameterizedEvent(string message)
{
ParameterizedEvent?.Invoke(message);
}
public bool RaiseFuncEvent(string input)
{
return FuncEvent?.Invoke(input) ?? false;
}
public void RaiseCustomEvent(string message, int number)
{
CustomEvent?.Invoke(message, number);
}
public void RaiseMultiParamEvent(string message, int number, bool flag)
{
MultiParamEvent?.Invoke(message, number, flag);
}
}
// Usage example
class Program
{
static void Main()
{
var examples = new EventExamples();
// Subscribe to events
examples.TraditionalEvent += (sender, e) => Console.WriteLine($"Traditional event: {e.Message}");
examples.SimpleEvent += () => Console.WriteLine("Simple event fired");
examples.ParameterizedEvent += message => Console.WriteLine($"Parameterized event: {message}");
examples.FuncEvent += input => { Console.WriteLine($"Func event: {input}"); return true; };
examples.CustomEvent += (message, number) => Console.WriteLine($"Custom event: {message}, {number}");
examples.MultiParamEvent += (message, number, flag) => Console.WriteLine($"Multi-param event: {message}, {number}, {flag}");
// Raise events
examples.RaiseTraditionalEvent("Hello, World!");
examples.RaiseSimpleEvent();
examples.RaiseParameterizedEvent("Event with parameter");
bool result = examples.RaiseFuncEvent("Func event input");
examples.RaiseCustomEvent("Custom message", 42);
examples.RaiseMultiParamEvent("Multi-param", 100, true);
}
}
در اینجا توضیح مختصری در مورد هر روش آورده شده است:
- رویداد سنتی: موارد استفاده
EventHandler<T>
با سفارشیEventArgs
. - رویداد ساده: موارد استفاده
Action
نمایندگی برای رویدادهای بدون پارامتر - رویداد پارامتری شده: موارد استفاده
Action<T>
برای رویدادهایی با یک پارامتر - رویداد Func: موارد استفاده
Func<T, TResult>
برای رویدادهایی که مقداری را برمی گرداند. - رویداد نمایندگی سفارشی: یک نماینده سفارشی برای امضاهای رویداد پیچیده تر تعریف می کند.
- رویداد چند پارامتری: موارد استفاده
Action<T1, T2, T3>
برای رویدادهایی با چندین پارامتر