رخدادها و delegate ها در C#

ساخت نمونه‌هاي جديد از يك delegate
آخرين كاري كهبايد انجام دهيد، ايجاد نمونه‌هاي جديد از delegate ساخته شده است. يك نمونة جديداز يك delegate، تنها انتزاعي از يك متد است كه با نامگذاري آن متد ايجاد مي‌شود. <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

كد:

class Clock
{
   

    public void RefreshTime(int hours, int minutes, int seconds)
    {
       

    }
   

}

با توجه به ساختار Tick، ملاحظه مي‌نماييد كه متد RefreshTime كاملاً با اين delegate همخواني دارد :

كد:

delegate void Tick(int hours, int minutes, int seconds);

و اين بدين معناست كه مي‌توان نمونةجديد از Tick ايجاد كرد كه انتزاعي از فراخواني RefreshTime در شيء خاصي از Clock است.

كد:

Clock wall = new Clock();

Tick m = new Tick(wall.RefreshTime);

حال كه m، ايجاد شد، مي‌توانيد از آن بصورت زيراستفاده نماييد :

كد:

m(12, 29, 59);

اين دستور در حقيقت كار دستور زير را انجام مي‌دهد (چون m دقيقاً انتزاع آن است) :

كد:

wall.RefreshTime(12, 29, 59);

همچنين مي‌توانيد m را بعنوان پارامتر به متدي ارسالنماييد. حال تمام چيزهايي را كه براي حل مسئله با استفاده از delegate بدانها نيازداشتيم را بررسي كرديم. در زير مثالي را مشاهده مي‌كنيد كه كلاسهاي Ticker و Clock را به يكديگر مرتبط نموده است. در اين مثال از واسط استفاده نشده و متد RefreshTime، متدي private است :

كد:

delegate void Tick(int hours, int minutes, int seconds);

class Clock
{
   

    public void Start()
    {
        ticking.Attach(new Tick(this.RefreshTime));
    }
 
    public void Stop()
    {
        ticking.Detach(new Tick(this.RefreshTime));
    }
 
    private void RefreshTime(int hours, int minutes, int seconds)
    {
        Console.WriteLine("{0}:{1}:{2}", hours, minutes, seconds);
    }
 
    private Ticker ticking = new Ticker();
}


با اندكي تامل و صرف وقت مي‌توانيد delegate رابطور كامل درك نماييد.

رخدادها (Events)
در برنامه‌هاي Console ،برنامه منتظر ورود اطلاعات يا دستوراتي از سوي كاربر مي‌ماند و با استفاده از ايناطلاعات كار مورد نظر را انجام مي‌دهند. اين روش برقراري ارتباط با كاربر، روشيناپايدار و غير قابل انعطاف است. در مقابل برنامه‌هاي Console، برنامه‌هاي مدرنوجود دارند كه با استفاده از GUI با كاربر در ارتباطند و بر پايه رخدادها بناشده‌اند (Event-Based)، بدين معنا كه رخدادي (منظور از رخداد اتفاقي است كه درسيستم يا محيط برنامه صورت ميگيرد.) در سيستم روي مي‌دهد و بر اساس اين رخداد عمليدر سيستم انجام مي‌شود. در برنامه‌هاي تحت ويندوز، نيازي به استفاده از حلقه‌هايمتعدد جهت منتظر ماندن براي ورودي از كاربر نيست، بلكه با استفاده از رخدادها،تراكنش بين سيستم و كاربر كنترل مي‌شود.

يك event در زبان C#، عضوي از كلاساست، كه در صورت بروز رخداد خاصي، فعال مي‌شود و عملي را انجام مي‌دهد. معمولاًبراي فعال شده event از دو عبارت fires و raised استفاده مي‌شود. هر متدي كهبخواهد، ميتواند در ليست رخداد ثبت شده و به محض اتفاق افتادن آن رخداد، از آن مطلعگردد.

بطور كلي مي‌توان گفت كه يك رخداد همانند يك فيلد اعلان مي‌شود بااين تفاوت مهم كه نوع آنها حتماٌ بايد يك delegate باشد.

Delegate ورخدادها در كنار يكديگر كار مي‌كنند تا قابليت‌هاي يك برنامه را افزايش دهند. اينپروسه با شروع يك كلاس كه يك رخداد را تعريف مي‌كند، آغاز مي‌شود. هر كلاسي، كه اينرخداد را درون خود داشته باشد، در آن رخداد ثبت شده است و مي‌تواند متدي را به آنرخداد تخصيص دهد. اين عمل با استفاده از delegate ها صورت مي‌پذيرد، بدين معني كه delegate متدي را كه براي رخداد ثبت مي‌شود را تعيين مي‌نمايد. Delegate هامي‌توانند هر يك از delegate هاي از پيش تعريف شدة.Net و يا هر delegate ي باشندكه توسط كاربر تعريف شده است. بطور كلي، delegate ي را به رخدادي تخصيص مي‌دهيم تامتدي را كهبهنگام روي دادن رخداد فراخواني مي‌شود، معين گردد. مثال زير روش تعريفرخداد را نشان مي‌دهد.

مثال 2-14 : اعلان و پياده‌سازي رخدادها

كد:

using System;
 
public delegate void MyDelegate();
 
class Listing14-2
{
   public static event MyDelegate MyEvent;
 
   static void <?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />Main()
   {
      MyEvent += new MyDelegate(CallbackMethod);
 
      //
فراخواني رخداد
      MyEvent();
 
      Console.ReadLine();
   }
 
   public static void CallbackMethod()
   {
      Console.WriteLine("CallbackMethod.");
   }
}

در اين مثال، ابتدا اعلان يك delegate ديده مي‌شود. درون كلاس، رخدادي با نام MyEvent و از نوع MyDelegate تعريف شده است. در متد Main() نيز مرجع جديدي به رخداد MyEvent افزوده شده است. همانطور كه در اين مثالنيز مشاهده مي‌كنيد، delegate ها تنها با استفاده از += مي‌توانند به رخدادهاافزوده شوند. در اين مثال هر گاه MyEvent فراخواني شود، متد CallbackMethod اجرامي‌شود چراكه با استفاده از مرجع delegate به رخداد مرتبط شده است. (يا در اصطلاحدر رخداد ثبت شده است.)

مثال فوق را بدون استفاده از رخداد نيز مي‌تواننوشت. اين نسخه از مثال 2-14 كه تنها در آن از delegate استفاده شده در زير آوردهشده است :

كد:

using System;
 
public delegate void MyDelegate();
 
class UsingDelegates
{
   static void Main()
   {
      MyDelegate del = new MyDelegate(CallbackMethod);
 
      // delegate
فراخواني
      del();
 
      Console.ReadLine();
   }
 
   public static void CallbackMethod()
   {
      Console.WriteLine("CallbackMethod.");
   }
}



بايد توجه كنيد كه موارد كاربرد رخدادها بيشتردر برنامه‌هاي تحت ويندوز نمايان مي‌شود و در اينجا شايد وجود آنها در برنامه برايشما مشهود نباشد. در آينده، به بررسي برنامه‌نويسي فرمهاي ويندوز نيز خواهيم رسيد ودر آنجا به طور مفصل درباره event ها و delegate ها مجدداً بحث خواهيم نمود.

بطور خلاصه مي‌توان گفت، با استفاده از delegate ها روشي براي ايجاد دسترسيبه متدها بط.ور پويا را فراهم نموديم. با استفاده از رخدادها نيز، در صورت بروزاتفاقي خاص، عملي خاص انجام مي‌گيرد. اين عمل معمولاٌ با استفاده از يك delegate كهمرجعي به يك متد در خود دارد انجام مي‌گيرد.


توضيحات پيشرفته :
درانتهاي اين درس مي‌خواهم توضيحات پيشرفته تري را نيز در اختيار شما قرار دهم. درقسمت مربوط به delegate ها در همين درس، مثالي مطرح شد كه در آن delegate ي با نام Tick وجود داشت. اعلان اين delegate به صورت زير بود :

 

كد:

delegate void Tick(int hours, int minutes, int seconds);

 

حال ميخواهيم به اين مثال يك رخداد نيز اضافه كنيم. در زير رخداد tick از نوع Tick

 


مطالب مشابه :


ویژوال بیسیک در یک نگاه

پاسکال،ویژوال بیسیک،دلفی، سی، شارپ، Pascal ،vb6،delphi،C#،C برنامه نویسی سوکت در سی شارپ با




فیلتر کردن DataGridView با LinQ

آموزش برنامه نویسی VB6 , Delphi. Pascal , CPP , C برنامه نویسی سوکت در سی شارپ با استفاده از TCP/IP .




آشنايي با Namespace در زبان C#

آموزش برنامه نویسی VB6 , Delphi. Pascal , CPP , C برنامه نویسی سوکت در سی شارپ با استفاده از TCP/IP .




رخدادها و delegate ها در C#

آموزش برنامه نویسی VB6 , Delphi. Pascal , CPP , C برنامه نویسی سوکت در سی شارپ با استفاده از TCP/IP .




اجرای دستورات Linq از بیس string

آموزش برنامه نویسی VB6 , Delphi. Pascal , CPP , C برنامه نویسی سوکت در سی شارپ با استفاده از TCP/IP .




چاپ متن توسط شی پرينتر vb6

آموزش برنامه نویسی چاپ متن توسط شی پرينتر vb6 برنامه نویسی سوکت در سی شارپ با استفاده از




نواع شمارشي enum در C#

پاسکال،ویژوال بیسیک،دلفی، سی، شارپ، Pascal ،vb6،delphi،C#،C برنامه نویسی سوکت در سی شارپ با




آشنايي با كلاسها در C#

آموزش برنامه نویسی VB6 , Delphi. Pascal , CPP , C برنامه نویسی سوکت در سی شارپ با استفاده از TCP/IP .




برچسب :