رویدادها (Events) در زبان برنامه‌نویسی C#

09 فروردین 1398
درسنامه درس 18 از سری آموزش سی شارپ (C#)
csharp-events

با مطالعه‌ی فصل گذشته اطلاعات بسیار دقیقی در زمینه‌ی نماینده‌ها (Delegate) در اختیار شما قرار گرفت و با مثال‌هایی که خدمت شما عزیزان ارائه کردیم تا حد مناسبی این مبحث را پوشش داریم اما یکی از مزایای استفاده از delegateها کنترل و مدیریت رویدادها بر حسب نیاز است. رویدادها یا Event ها به عنوان یک اعلان یا توصیه یا رفتار در طی یک برنامه ظاهر می‌شوند. در این فصل قصد داریم این موضوع را به صورت کامل پوشش داده تا از آموزش دیگری شما را بی نیاز کنیم.

مقدمه

در حالت عادی و زندگی روزمره‌ی خود رویدادهای بسیاری را کنترل می‌کنید. برای درک بهتر با یک مثال در دنیای واقعی شروع می‌کنیم. فرض کنید شما صبح از خواب بیدار می‌شوید و شروع به دست شستن می‌کنید و سپس یک دوش آب گرم گرفته و از حمام بیرون می‌آید. حال معده شما فرمان گرسنگی صادر می‌کند و رویداد «غذا خوردن و آشامیدن آب» باید رخ دهد. یعنی به ازای گرسنگی ای که ناگهان ایجاد شده است شما باید پاسخی مناسب را ارسال کنید. Event ها یا رویدادها دقیقا به همینصورت عمل می‌کنند. یعنی وقتی ما یک Event را تعریف می‌کنیم در واقع به برنامه و نرم‌افزار خود دستور می‌دهیم که در صورت بروز یک اتفاق خاص (مثلا کلیک کردن روی یک گزینه یا دکمه) رویداد مدنظر ما رخ دهد. این عمل را در مجموعه‌ی کدهای فصل گذشته به تعداد بسیار زیادی انجام داده‌ایم. قسمتی از کد شما که می‌نویسید Console.Readkey به صورت متد بوده که منتظر می‌ماند تا کاربر یک دکمه از صفحه کلید را بفشارد. به محض انجام این عمل، صفحه بسته خواهد شد. در واقع Event یا رویداد بسته شدن رخ می‌دهد.

امروزه بسیاری از نرم‌افزارهای مدرن از سیستم متناسب با کنترل رویداد استفاده می‌کنند. در زبان برنامه‌نویسی #C، یک رویداد یا event به عنوان یک عضو کلاس شناخته می‌شود که هرگاه باید از آن استفاده شود، فراخوانی می‌شود. عموما برنامه‌نویسان برای فراخوانی یک رویداد از عبارت fire یا شلیک استفاده می‌کنند. یعنی مثلا یک اتفاق خاص که رخ داد رویداد x فایر یا fire می‌شود.

همچنین رابطه‌ی بسیار نزدیکی بین رویدادها (Events) و نماینده‌ها (Delegates) وجود دارد. که این دو با همکاری یکدیگر یک نرم افزار functionality یا تابع محور را ایجاد می‌کنند.

تعریف یک رویداد یا Event

برای تعریف یک رویداد یا Event در زبان برنامه‌نویسی #C باید ابتدا یک delegate یا نماینده تعریف کنیم سپس یک رویداد با کلمه‌ی event و از نوع همان delegate‌ای که تعریف کرده‌ایم، ایجاد خواهیم کرد.

بنابراین الگوی ساختاری آن پس از ایجاد یک delegate به صورت زیر است:

public event {delegate data type} {eventname};

delegate data type:‌ در واقع نام همان delegate است که برای این event ایجاد کرده‌ایم.

eventname: نامی که برای آن event در نظر می‌گیریم.

به مثال زیر توجه کنید:

using System;
using System.Drawing;
using System.Windows.Forms;

// custom delegate
public delegate void Startdelegate();

class Eventdemo : Form
{
    // custom event
    public event Startdelegate StartEvent;

    public Eventdemo()
    {
        Button clickMe = new Button();

        clickMe.Parent = this;
        clickMe.Text = "Click Me";
        clickMe.Location = new Point(
            (ClientSize.Width - clickMe.Width) /2,
            (ClientSize.Height - clickMe.Height)/2);

        // an EventHandler delegate is assigned
        // to the button's Click event
        clickMe.Click += new EventHandler(OnClickMeClicked);

        // our custom "Startdelegate" delegate is assigned
        // to our custom "StartEvent" event.
        StartEvent += new Startdelegate(OnStartEvent);

        // fire our custom event
        StartEvent();
    }

    // this method is called when the "clickMe" button is pressed
    public void OnClickMeClicked(object sender, EventArgs ea)
    {
        MessageBox.Show("You Clicked My Button!");
    }

    // this method is called when the "StartEvent" Event is fired
    public void OnStartEvent()
    {
        MessageBox.Show("I Just Started!");
    }

    static void Main(string[] args)
    {
        Application.Run(new Eventdemo());
    }
}

نکته ضروری: در صورتیکه برای تست این مثال از نرم افزار Visual Studio‌ استفاده می‌کنید باید در نظر داشته باشید که DLL‌ مربوط به ویندوز فرم را که به صورت System.Drawing.dll‌ است به قسمت Reference های پروژه خود اضافه کنید برای این کار روی Reference راست کلیک کرده و سپس add را بزنید در پنجره‌ای که باز شده است به دنبال عبارت System.Drawing‌ کلیک کرده و سپس به صورت خودکار به Referenceهای شما اضافه می‌شود.

در مثال فوق کلاس Eventdemo از کلاس اصلی Form مشتق شده است که کلاس والد آن ویندوز فرم می‌باشد. در این سری از دوره‌های آموزشی، آموزش ویندوز فرم در اختیار شما قرار نمی‌گیرد بلکه در آن به آموزش مفصل زبان برنامه‌نویسی #C پرداخته‌ایم.

بنابراین به تشریح این مثال می‌پردازیم. در عبارتهای فوق همانطور که ملاحظه می‌کنید در ابتدا یک نماینده یا delegate را ایجاد کرده‌ایم و نام آن را Startdelegate قرار داده که دارای نوع void می‌باشد و هیچگونه پارامتری را به عنوان ورودی نمی‌پذیرد. پس این اولین راهنمایی‌ست که اگر متدهایی را تعریف کردیم و می‌خواستم که این نماینده به آنها اشاره کند باید هیچگونه پارامتری در آنها تعریف نشده باشد. سپس در داخل کلاس Eventdemo یک رویداد با کلمه‌ی کلیدی event‌ و از نوع delegate با نام StartEvent نوشته‌ایم. در نهایت داخل یک متد تحت عنوان Eventdemo که به عنوان سازنده‌ی پیش‌فرض این کلاس است. یک دکمه ایجاد کرده و نام آن را click me قرار داده‌ایم. بنابراین طی یک عملیات در خط بعدی نوشته‌ایم که اگر روی دکمه‌ی clickMe کلیک شد. آنگاه یک delegate با نام EventHandler ایجاد شود که به متد OnClickMeClicked اشاره می‌کند. پس از ایجاد این نماینده یک نماینده دیگر تحت عنوان Startdelegate به متدی به نام OnStartEvent ایجاد شده و درون متغییر از نوع delegate به نام StartEvent ریخته شود. سپس آن Event یا متغییری که از نوع delegate است را فراخوانی می‌کنیم. نام این متغییر نماینده ()StartEvent می‌باشد. در ادامه نیز پیام‌های مرتبط با هر متد را درون آنها قرار داده‌ایم.

در ادامه نیز یک مثال خیلی ساده تر در محیط کنسول اپلیکیشن در اختیار شما عزیزان قرار می‌دهیم که با مفهوم eventها بیشتر آشنا شوید:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace RoxoApplication
{
    public delegate void startEvent();
    class Program
    {
        public event startEvent Fired;
        static void Main(string[] args)
        {
            int a = 1, b = 2;

            Console.WriteLine("Waiting for event fire....");
            if (a > 2)
            {
                startEvent Fired = new startEvent(remove);
                Fired();
            }
            else
            {
                startEvent dontFired = new startEvent(dontRemove);
                dontFired();
            }


            Console.ReadKey();
        }
        static void remove()
        {
            Console.WriteLine("Remove Event Fired!");
        }
        static void dontRemove()
        {
            Console.WriteLine("Dont Remove Event Fired!");
        }
    }
}

در این مثال ابتدا یک delegate تعریف کرده‌ایم سپس با استفاده از یک event به نام startEvent رویداد موردنظر خود را که شامل متدهای remove و dontRemove است کنترل کرده‌ایم. اگر چه در این مثال جواب مشخص است ولی صرفا مطالب این مجموعه جنبه آموزشی دارد و در دنیای عملی گاها بی کاربرد است.

بسیار عالی به شما تبریک می‌گوییم. با مطالعه‌ی این فصل آموزش دقیق مبحث eventها را فراگرفتید و می‌توانید از این ابزار کارآمد در بسیاری از پروژه‌های خود بهره ببرید. بنابراین برای ورود به دنیای حرفه‌ای همیشه باید مفاهیم پایه را به دقت یاد گرفت.

خب این دوره آموزشی به اتمام رسید. دوستان عزیز ما سعی کردیم در طی ۱۸ فصل اکثر مباحث مقدماتی تا پیشرفته سی شارپ را در اختیار شما عزیزان قرار دهیم. اما قطعا هیچ دوره آموزشی نمی تواند ادعا کند که تمام مطالب را ارائه کرده است زیرا دنیای برنامه نویسی همیشه بدون مرز بوده و هر لحظه مفاهیم جدید برای یادگیری وجود دارند.

همراهی شما افتخار روکسو است و امیدوارم در طی دوره های آموزشی دیگری بتوانیم مباحث جدیدی را به شما عزیزان ارائه کنیم.

تمام فصل‌های سری ترتیبی که روکسو برای مطالعه‌ی دروس سری آموزش سی شارپ (C#) توصیه می‌کند:
نویسنده شوید
دیدگاه‌های شما (3 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

جواد
10 آبان 1402
سلام تشکر از سایت عالیتون

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

عرفان
06 فروردین 1399
سلام میخواستم بپرسم دقیقا فرق event و delegate تو کارایی چیه و اینکه میشه متد های غیر استاتیک رو داخل delegate ریخت یا نه(چون چند جا دیدم که میگفتن میشه ولی خودم انجام دادم ارور داد)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

علی مومن زاده
28 آذر 1397
آموزش مربوط به نماینده ها و رویداد ها بسیار عالی و روان بود. ممنونم

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.