حسین احمدی
بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

آموزش کار با Event ها در سی شارپ

از قدیم گفتن هر عملی یک عکس العمل دارد. شما در خیابان در حال راه رفتن هستید، ناگهان دوست خود را می بینید و او به شما سلام می کند، شما ناخودآگاه جواب سلام او را با زبانی که بین شما و دوستتان تعریف شده می دهید، حال این جواب سلام می تواند خیلی رسمی باشد یا خیلی خودمانی. یعنی شما بر اساس شخصی که به شما سلام می دهد، جواب سلامی متفاوت می دهید!

دوره های شبکه، برنامه نویسی، مجازی سازی، امنیت، نفوذ و ... با برترین های ایران

در حقیقت بین شما و دوست شما یک Event وجود دارد با این تعریف: «اگر برای مثال محمد را دیدم و او به من سلام کرد، من هم جواب سلام او را می دهم.» در زبان های برنامه نویسی که از قابلیت Event ها پشتیبانی می کنند نیز به همین صورت است، شما می توانید برای هر کلاس یک Event تعریف کنید که این Event، در شرایطی خاص اجرا می شود. تعریف و استفاده از Event ها به طور مستقیم به مبحث Delegate ها ارتباط دارند. در این بخش با نحوه تعریف و استفاده از Event ها آشنا می شویم. فرض کنید دو کلاس داریم با نام Person و PersonRepository که به صورت زیر تعریف شده اند:

public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

public class PersonRepository
{
    public void Add(Person person)
    {
        // add person to database
    }

    public void RemovePerson(Person person)
    {
        // remove person from database
    }
}

کلاس Person مدل سازی موجودیت یک شخص در برنامه و کلاس PersonRepository وظیفه حذف و اضافه کردن موجودیت Person را از Database دارد. حال فرض کنید می خواهیم زمانی که یک شخص به بانک اطلاعاتی اضافه شد، یک کد اجرا شود، این کد مشخص نیست و می بایست از بیرون کلاس مشخص شود. برای این کار باید از Event ها استفاده کنیم. ابتدا باید یک Delegate برای Event مورد نظر تعریف کنیم:

public delegate void OnPersonAddOrRemove(Person addedPerson);

Delegate بالا، signature متدی را تعریف می کند که نوع بازگشتی آن void و پارامتر ورودی آن از نوع Person است. حال باید برای کلاس PersonRepositorty رویداد های مورد نظر را تعریف کنید. ساختار تعریف Event به صورت زیر است:

public event {delegate data type} {eventname};
  1. delegate data type: نوع داده delegate ای که تعریف کردیم را در این قسمت می نویسیم
  2. eventname: نام event را مشخص می کند

در قدم بعدی، کلاس PersonRepository را به صورت زیر تغییر می دهیم:

public class PersonRepository
{
    public event OnPersonAddOrRemove OnPersonAdded;
    public event OnPersonAddOrRemove OnPersonRemoved;

    public void Add(Person person)
    {
        // add person to database
        if (OnPersonAdded != null)
            OnPersonAdded(person);
    }

    public void RemovePerson(Person person)
    {
        // remove person from database
        if (OnPersonRemoved != null)
            OnPersonRemoved(person);
    }
}

همانطور که در کد بالا مشاهده می کنید، ابتدا دو event با نام های OnPersonAdded و OnPersonRemoved به کلاس PersonRepository اضافه شده اند، داخل متدهای Add و Remove، ابتدا بررسی کردیم که Event های مربوطه null هستند یا خیر، در صورت null نبودن اقدام به فراخوانی event کردیم. دقت کنید اگر برای event، متدی مشخص نکنیم، مقدار event برابر null است. برای استفاده از event های تعریف شده، ابتدا متدی برای event تعریف می کنیم:

private static void OnPersonAdded(Person addedPerson)
{
    Console.WriteLine("Person " + addedPerson.FirstName + " " + addedPerson.LastName + " added to database.");
}

در حال زمان استفاده از کلاس PersonRepository، باید Event مورد نظر را مقدار دهی کنیم:

PersonRepository repository = new PersonRepository();
repository.OnPersonAdded += OnPersonAdded;

repository.Add(new Person()
{
    FirstName = "Hossein",
    LastName = "Ahmadi"
});

در کد بالا، بعد از اضافه کردن یک Person، کدی که برای رویداد Add نوشتیم فراخوانی می شود.علاوه بر اینکه می توانید به یک Event، یک کد را منسوب کنید، می توانید متد منسوب شده را از Event بردارید، برای اینکار به صورت زیر عمل می کنید:

repository.OnPersonAdded -= OnPersonAdded;

می توانید برای انتساب یک متد به یک Event، از Anonymous Method ها و Lambda Expression ها نیز استفاده کنید.استفاده از Event ها کاربردهای خیلی زیادی دارد، مخصوصاً در نوشتن برنامه های Windows Application که باید برای کنترل های فرم ها، رویدادهای مختلف تعریف کنیم. امیدوارم که این آموزش مورد توجه شما دوستان عزیز قرار گرفته باشد. ITPRO باشید

نویسنده: حسین احمدی

انجمن تخصصی فناوری اطلاعات ایران


حسین احمدی
حسین احمدی

بنیانگذار توسینسو و برنامه نویس و توسعه دهنده ارشد وب

حسین احمدی ، بنیانگذار TOSINSO ، توسعه دهنده وب و برنامه نویس ، بیش از 12 سال سابقه فعالیت حرفه ای در سطح کلان ، مشاور ، مدیر پروژه و مدرس نهادهای مالی و اعتباری ، تخصص در پلتفرم دات نت و زبان سی شارپ ، طراحی و توسعه وب ، امنیت نرم افزار ، تحلیل سیستم های اطلاعاتی و داده کاوی ...

نظرات