ایران سرفراز- نرم افزار وپروژهای دانشجویی


نرم افزار وپروژهای دانشجویی

فصل هیجدهم در نماینده ورویداد # C

<!-- /* Font Definitions */ @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-1610611985 1107304683 0 0 159 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman","serif"; mso-fareast-font-family:"Times New Roman";} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-size:10.0pt; mso-ansi-font-size:10.0pt; mso-bidi-font-size:10.0pt;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 72.0pt 72.0pt 72.0pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} -->

C

#  در  نماینده ورویدادها

بعد از خواندن این فصل قادر به انجام کارهای زیر خواهید بود:

- اعلان یک نوع دادهی نماینده برای ایجاد یک انتزاع از یک نشانه متد

- ایجاد یک نمونه از نوع دادهی نماینده برای ارجاع به یک متد بینام

- فراخوانی یک متد از طریق یک نماینده

- اعلان یک فیلد رویداد

- ادارهکردن یک رویداد با استفاده از نماینده

- رها کردن یک رویداد

بیشتر کدهایی که تا به حال نوشتهاید به طور ترتیبی اجرا میشوند. در بعضی مواقع لازم است برنامه جریان جاری اجرا را

متوقف کرده و کار مهمتر دیگری را انجام دهد. زمانی که کار کامل شود، برنامه میتواند از جایی که ترک شده بود ادامه یابد.

مثال کلاسیک این نوع برنامهها، برنامههای ویندوزی است. یک فرم کنترلهایی همچون دکمه و کادر متنیها را نمایش

میدهد. زمانی که روی یک دکمه کلیک میکنید یا متنی در کادر متنی تایپ میکنید، انتظار دارید فرم فوراً به آن

عکسالعمل نشان دهد. برنامه باید کار جاری را موقتاً متوقف کند و ورودی شما را اداره کند. این نوع عملیات فقط به

واسطهای گرافیکی کاربر اعمال نمیشود، در هر نوع برنامه میتوانیم از این تکنولوژی استفاده کنیم.

به منظور ادارهی این نوع برنامه، در زمان اجرا دو چیز باید فراهم گردد: وسیلهای برای تشخیص مورد اضطراری که رخ داده

است و روشی برای تعیین متدی که در حین وقوع این رویداد باید اجرا شود. این عملیات هدف رویدادها و نمایندهها است.

-1-18 اعلان و کاربرد نمایندهها

یک نماینده 1، اشارهگری به یک متد است. یک نماینده در هنگام فراخوانی شبیه یک متد عادی بوده و شبیه یک متد رفتار

میکند. زمانی که یک نماینده را فراخوانی میکنید، برنامه متدی که نماینده به آن ارجاع میکند را اجرا میکند. می توانید به

طور پویا متدی که یک نماینده به آن ارجاع میکند را تغییر دهید. بنابراین کدی که یک نماینده را فراخوانی میکند، ممکن

است در هر بار اجرا متد مختلفی را اجرا کند. بهترین راه فهم نمایند هها، دیدن آنها در عمل است. یک مثال بررسی می کنیم.

1 Delegate

فصل هجدهم نماینده ها

317

-1-1-18 سناریوی کارخانه اتوماتیک

فرض کنید سیستمهای کنترل را برای یک کارخانهی اتوماتیک مینویسید. کارخانه تعداد زیادی ماشین مختلف دارد که

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

جوشکاری ورقهها به هم، رنگ کاری ورقهها و غیره. هر ماشین توسط فروشندهی خاصی ساخته و نصب شده است. ماشینها،

ها فراهم کردهاند تا بتوانید برای کنترل آنها به API همه کنترل شده به وسیله کامپیوتر هستند و هر فروشنده مجموعهای از

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

دارید روی آن تمرکز کنید، فراهم کردن یک وسیله برای خاموش کردن همه ماشینها در مواقع اضطراری است.

به معنی واسط برنامهنویسی کاربردی است. آن یک متد یا مجموعهای از متدها است که به شما اجازه API توجه: عبارت

درنظر بگیرید. API را به صورت مجموعه ای از توابع NET. میدهد یک نرم افزار را کنترل کنید. میتوانید چارچوب

هر ماشین پروسهی کنترلی منحصر به فرد خود را برای خاموشکردن امن دارد. اینها به صورت زیر خلاصه میشوند:

StopFolding(); // Folding and shaping machine

FinishWelding(); // Welding machine

PaintOff(); // Painting machine

-2-1-18 پیادهسازی کارخانه بدون کاربرد نمایندهها

یک روش ساده برای پیادهسازی عمل خاموش کردن سیستم در یک برنامهی کنترلی بصورت زیر نمایش داده میشود:

class Controller

{

...

public void ShutDown()

{

folder.StopFolding();

welder.FinishWelding();

painter.PaintOff();

}

...

// Fields representing the different machines

private FoldingMachine folder;

private WeldingMachine welder;

private PaintingMachine painter;

}

اگرچه این روش کار میکند، ولی آن خیلی قابل توسعه و انعطافپذیر نیست. اگر کارخانه یک ماشین جدید بخرد، شما باید

و کلاسهای ماشین خیلی قوی به هم پیوستهاند. Controller این کد را تغییر دهید. کلاس

-3-1-18 پیادهسازی کارخانه با استفاده یک نماینده

اگرچه اسامی هر متد متفاوت است، ولی همهی آنها صورت یکسانی دارند. آنها هیچ پارامتری نمیگیرند و هیچ مقداری بر

نمیگردانند. قالب کلی هر متد بصورت زیر است.

void methodName();

در اینجا یک نماینده مفید است. یک نماینده که با این صورت متد مطابقت داشته باشد، میتواند برای ارجاع به هر متد

خاموشکردن ماشین استفاده شود. یک نماینده را شبیه زیر اعلان کنید:

delegate void stopMachineryDelegate();

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

را بکار برید. delegate • زمان اعلان یک نماینده کلمهی کلیدی

mohsen_mahyar@yahoo.com - C# نویسی  برنامه

318

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

نماینده و پارامترهای آن را مشخص کنید.

بعد از تعریف نماینده، میتوانید یک نمونه از آن ایجاد کنید و با استفاده از عملگر =+ آنرا به متد منطبق ارجاع دهید.

انجام دهید. Controller میتوانید این کار را در سازندهی کلاس

class Controller

{

delegate void stopMachineryDelegate();

...

public Controller()

{

this.stopMachinery += folder.StopFolding;

}

...

private stopMachineryDelegate stopMachinery; // Create an instance of the delegate

}

میشود تا در overload + شما یک متد به نماینده اضافه کردید. اما در واقع، متد را در این نقطه فراخوانی نکردهاید. عملگر

زمان استفاده در نمایندهها، معنی جدیدی داشته باشد. توجه کنید که شما فقط نام متد را مشخص کردید و نباید هیچ پارانتز

یا پارامتری را در بر داشته باشد. کاربرد عملگر =+ روی یک نمایندهی مقداردهی اولیه نشده صحیح است. آن بطور اتوماتیک

را برای مقداردهی اولیه یک نماینده به متد خاص بکار برید، new مقداردهی اولیه خواهد شد. شما میتوانید کلمهی کلیدی

شبیه این:

this.stopMachinery = new stopMachineryDelegate(folder.stopFolding);

میتوانید با احضار نماینده، متد را فراخوانی کنید.

public void ShutDown()

{

this.stopMachinery();

...

}

احضار یک نماینده دقیقاً شبیه فراخوانی یک متد است و اگر متدی که نماینده به آن ارجاع میکند پارامتری دارد، همین جا

باید آنها را مشخص کنید.

نکته: اگر شما برای احضار نمایند هی مقدار دهی اولیه نشده تلاش کنید، یک استثناء

خواهید گرفت. NullRefrencException

مزیت اصلی کاربرد یک نماینده توانایی ارجاع آن به بیش از یک متد است. به سادگی عملگر =+ را برای اضافهکردن متدها به

نماینده به کار برید.

public Controller()

{

this.stopMachinery += folder.StopFolding;

this.stopMachinery += welder.FinishWelding;

this.stopMachinery += painter.PaintOff;

}

به طور اتوماتیک هر متد را به ترتیب ،Controller از کلاس ShutDown در متد ()this.stopMachinery احضار

نیازی نیست بداند چند تا ماشین وجود دارد یا اسامی متد چیست. با استفاده از ()ShutDown فراخوانی خواهد کرد. متد

عملگر =- میتوانید یک متد را از یک نماینده حذف کنید.

this.stopMachinery -= folder.StopFolding;

فصل هجدهم نماینده ها

319

را کاملاً مستقل از Controller شمای جاری، متدهای ماشین را در سازنده به نماینده اضافه میکند. برای اینکه کلاس

ماشینهای متنوع نگه دارید. لازم است یک روشی فراهم کنید که از خارج کلاس بتوان متدهایی را به نماینده اضافه کرد.

چندین انتخاب وجود دارد:

اعلان کنید. public • متغیر نماینده را

public stopMachineryDelegate stopMachinery;

تعریف کنید، ولی یک خصوصیت برای خواندن و نوشتن به آن اضافه کنید. البته باید private • متغیر نماینده را

مشخص کنید. public تعریف نماینده را

public delegate void stopMachineryDelegate();

...

public stopMachineryDelegate StopMachinery

{

get

{

return this.stopMachinery;

}

set

{

this.stopMachinery = value;

}

}

یک متد را به عنوان یک پارامتر گرفته و Add کپسولهسازی کامل را فراهم میآورد. متد ،Add وRemove پیادهسازی متدهای

یک متد را از نماینده حذف میکند. Remove آن را به نمایند ه اضافه میکند و با متد

public void Add(stopMachineryDelegate stopMethod)

{

this.stopMachinery += stopMethod;

}

public void Remove(stopMachineryDelegate stopMethod)

{

this.stopMachinery -= stopMethod;

}

را انتخاب میکنید. هر تکنیکی که انتخاب Remove/ Add اگر برنامهنویس شیگرای وسواسی هستید، احتمالاً روش

حذف کنید. سپس اشیای مورد نیاز از Controller میکنید، باید کد مربوط به اضافهکردن متد به نماینده را از سازندهی

و ماشینهای دیگر را به صورت زیر معرفی کنید. Control کلاس

Controller control = new Controller();

FoldingMachine folder = new FoldingMachine();

WeldingMachine welder = new WeldingMachine();

PaintingMachine painter = new PaintingMachine();

...

control.Add(folder.StopFolding);

control.Add(welder.FinishWelding);

control.Add(painter.PaintOff);

...

control.ShutDown();

...

-4-1-18 متدها و نماینده های بینام

همه مثالهای اضافهکردن یک متد به نماینده که شما دیدهاید، همگی نام متد را به کار میبرند. برای مثال، به سناریوی

اضافه میکنید برگردید. ما stopMachinery را به نمایندهی Folder شی StopFolding کارخانهی اتوماتیک که متد

این کار را کردیم:

this.stopMachinery += folder.StopFolding;

mohsen_mahyar@yahoo.com - C# نویسی  برنامه

320

این روش در صورتی که یک متد مناسب منطبق با نشانهی نماینده وجود داشته باشد، مفید است. اما اگر نباشد، چه اتفاقی

نشانه زیر را داشته باشد. StopFolding می افتد؟ فرض کنید، متد

void StopFolding(int shutDownTime); // Shut down within the

specified number of seconds

فرق میکند. پس نمیتوانیم نماینده ی یکسانی برای ادارهکردن هر سه متد PaintOff و FinishWelding این با متدهای

به کار بریم.

ایجادیک مبدل متد

را فراخوانی میکند و هیچ پارامتری نمیگیرد. شبیه StopFolding روش پیرامون این مسأله، ایجاد متد دیگری است که

این:

void FinishFolding()

{

folder.StopFolding(٠); // Shutdown immediately

}

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

مختلف تبدیل میکند.

در بیشتر موارد، متدهای مبدل همانند این کوچک هستند و گمکردن آنها در دریایی از متدها سادهتر است. جدا از کاربرد آن

متدهای بینام را #C . جهت استفاده توسط نماینده ، آن در جای دیگر فراخوانی میشود StopFolding برای تبدیل متد

برای این مواقع فراهم میکند.

کاربرد یک متد بینام به عنوان یک مبدل

متد بینام، متدی است که نام ندارد. این بسیار عجیب به نظر میرسد. اما متدهای بینام کاملاً مفید هستند. در صورتی که

یک قطعه کد داریم که هرگز مستقیماً فراخوانی نمیشود، اما دوست دارید از طریق یک نمایند ه قادر به فراخوانی آن باشید،

که تا به حال بحث شده، یک مثال است. هدف منحصر به فرد آن، FinishFolding اینها فرصت خوبی هستند. متد

است. هر جایی که یک نمایند ه را به کار میبرید، می توانید متد بدون نام استفاده StopFolding فراهمکردن مبدل برای

قرار دهید. برای استفاده از متد بدون نام به عنوان یک delegate کنید. کد مورد نظر را داخل {} بعد از کلمهی کلیدی

میتوانید این را بنویسید. ،StopMachinery و اضافهکردن آن به نماینده ی StopFolding مبدل برای متد

this.stopMachinery += delegate { folder.StopFolding(٠); };

نیست. FinishFolding دیگر نیازی به ایجاد متد

می توانید یک متد بدون نام را به عنوان یک پارامتر به جای نماینده به یک متد ارسال کنید. شبیه این:

control.Add(delegate { folder.StopFolding(٠); } );

ویژگیهای متدهای بینام

مشخص میشوند. برای مثال: delegate • هر پارامتر مورد نیاز در {} بعد از کلمهی کلیدی

control.Add(delegate(int param١, string param٢) { /* code that uses param١

and param٢ ... });

متدهای بدو ن نام م ی توانند مقادیری را برگردانن د . اما نوع مقدار بازگشتی باید با نمایند ه ای که به آن اضافه م ی شود

تطابق داشته باشد.

فصل هجدهم نماینده ها

321

شما می توانید عملگر = - را برای حذف یک متد از یک متغیر نمایند ه به کار بری د . اما آن چیزی که حذف خواهد کرد

را دقیقا حس نمیکند. متدهای بینام که کد یکسانی را دربردارند، در واقع نمونههای مختلفی از کد هستند.

است . آن می تواند از چندین دستور، فراخوانی متدها، تعریف متغیرها و غیر تشکیل #C • کد یک متد ب ی نام، کد عاد ی

شود.

زمانی که متد بینام خاتمه مییابد، متغیرهای تعریف شده در یک متد بینام، از دامنه خارج میشوند.

یک متد ب ی نام می تواند به متغیرهای دامن ه ی خود دستیابی کند و تغییرات انجام ده د . متغیرهای دستکاری شده با

این روش را متغیرهای خارجی تصرف شده 1 گویند. در مورد این ویژگی خیلی مواظب باشید.

فعالکردن هشدارها بوسیلهی رویدادها

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

چندین متد را به صورت غیرمستقیم مجاز میدارند، شما هنوز مجبور هستید نماینده را صریحاً احضار کنید. اگر یک نماینده

هنگام وقوع یک چیز مهم بطور اتوماتیک اجرا گردد، این عمل مفید خواهد بود

برای متوقف کردن وسیله (زمانی که بیش StopMachinery مثال: در سناریوی کارخانهی اتوماتیک، توانایی احضار نماینده

رویدادها به شما اجازه میدهند عملیات مهم را تعریف کرده و محبوس 2 .NET از حد داغ باشد)، حیاتی است. در چارچوب

نمایید و آنها را برای یک نمایند ه که جهت ادارهکردن این موقعیت فراخوانی میشود، نظم دهید. بیشتر کلاسها در چاچوب

رویدادها را آشکار میسازند. NET.

-2-18 اعلان یک رویداد

یک رویداد را در یک کلاس نامزد برای عملکردن به صورت یک منبع رویداد اعلان کنید. یک منبع رویداد معمولا کلاسی

است که بر محیط نظارت میکند و در صورت وقوع یک چیز مهم، یک رویداد آزاد میکند. در کارخانهی اتوماتیک، یک منبع

رویداد میتواند کلاس مربوط به نظارت بر دمای لحظهای ماشین باشد. کلاس ناظر دماسنج اگر تشخیص دهد که یک ماشین

بیش از حد گرم شده است، رویداد زیاد گرم شدن را آزاد میکنند. یک رویداد لیستی از متدها را نگه میدارد که هنگام آزاد

شدن رویداد باید فراخوانی شوند. بعضی اوقات این متدها را متعهدها 3 میگویند. این متد باید برای ادارهکردن رویداد زیاد

گرم شدن فراهم شود و عمل اصلاحی ضروری انجام گیرد( برای مثال ،ماشین خاموش شود).

یک رویداد را شبیه اعلان یک فیلد، اعلان کنید. چون رویدادها قصد دارند با نمایند هها به کار برده شوند. نوع یک رویداد

را قرار دهید. event باید نماینده باشد و در خط اعلان کلمهی کلیدی

از کارخانه اتوماتیک را در نظر بگیرید. من آن را به یک کلاس جدید به نام StopMachineryDelegate مثال: نماینده ی

انتقال دادهام، که این کلاس یک واسط برای نظارت الکترونیکی دمای دستگاهها فراهم میکند. TemperatureMonitor

class TemperatureMonitor

{

public delegate void StopMachineryDelegate();

...

}

1 Captured

2 Trap

3 Subscriber

mohsen_mahyar@yahoo.com - C# نویسی  برنامه

322

را احضار خواهد کرد. StopMachineryDelegate را تعریف کنید که MachineOverheating حال میتوانید رویداد

class TemperatureMonitor

{

public delegate void StopMachineryDelegate();

public event StopMachineryDelegate MachineOverheating;

...

}

را در صورت نیاز رها میکند. MachineOverheating به طور اتوماتیک رویداد TemperatureMonitor منطق کلاس

یک رویداد کلکسیونی داخلی از نمایندههای وابسته را نگه می دارد. نیازی نیست متغیر نمایند هتان را به صورت دستی نگه

دارید.

-1-2-18 متعهد شدن به یک رویداد

شبیه نمایندهها، رویدادها نیز با علمگر =+ میآیند. با استفاده از عملگر =+ به یک رویداد متعهد میشوید. در کارخانهی

رها میشود، نرم افزار کنترل هر ماشین میتوانند برای فراخوانی MachineOverheating اتوماتیک، زمانی که رویداد

متدهای خاموش سازماندهی شوند.

TemperatureMonitor tempMonitor = new TemperatureMonitor();

...

tempMonitor.MachineOverheating += delegate { folder.StopFolding(٠) };

tempMonitor.MachineOverheating += welder.FinishWelding;

tempMonitor.MachineOverheating += painter.PaintOff;

توجه کنید که گرامر با اضافهکردن یک متد به یک نماینده یکسان است. حتی میتوانید با استفاده از متد بینام متعهد

اجرا میگردد، آن همهی متدهای متعهد شده را tempMonitor.MachineOverheating شوید. زمانی که رویداد

فراخوانی میکند و ماشینها را خاموش میکند.

-2-2-18 غیر متعهد شدن از یک رویداد

به طوری که میدانید عمل گر =+ برای وابستهکردن یک نماینده به یک رویداد استفاده میشود. میتوانید حدس بزنید که

عملگر =- برای جدا کردن یک نماینده از یک رویداد استفاده میگردد. فراخوانی عملگر =- متد را از کلکسیون نمایند ه

داخلی رویداد حذف میکند. اغلب این عمل با عنوان غیرمتعهد شدن از یک رویداد بیان میکنند.

-3-2-18 رها کردن یک رویداد

با فراخوانی یک رویداد همچون یک متد یا نماینده، میتوانید آن رویداد را رها کنید. زمانی که رویداد رها میشود، همهی

یک متد tempretuerMonitor نماینده های وابسته شده به ترتیب فراخوانی میشوند. برای مثال، در اینجا کلاس

را رها میکند. MachineryOverheating دارد که رویداد Notify خصوصی

class TemperatureMonitor

{

public delegate void StopMachinerDelegate;

public event StopMachineryDelegate MachineOverheating;

...

private void Notify()

{

if (this.MachineOverheating != null)

{

this.MachineOverheating();

}

}

...

}

فصل هجدهم نماینده ها

323

است و فقط زمانی که یک متد با استفاده null ضروری است، چون یک فیلد رویداد قطعاً null این زبان ویژه است. بررسی

را رها کنید. یک استثناء null میشود. اگر سعی کنید یک رویداد null از عملگر =+ به آن متعهد گردد، غیر

دریافت خواهید کرد. اگر نماینده رویدادی تعریف کند که پارامترهایی را انتظار میرود، NullReferenceException

زمانی که رویداد رها میشود، باید آرگومانهای مناسب فراهم شوند.

GUI -3-18 رویدادهای

ها، رویداد را بطور وسیع به خدمت GUI برای ساختن .NET همان طور که قبلاً بیان شد، کنترلها و کلاسهای چارچوب

را به EventHandler از نوع Click مشتق میشود. یک رویداد Control از کلاس Button میگیرند. برای مثال، کلاس

دو پارامتر دارد. یکی ارجاع به شیئی است که رویداد را رها کرده EventHandler ارث میبرد. کد زیر را ببینید. نمایندهی

که اطلاعات اضافی درباره رویداد را دربردارد. EventArgs است و شی

namespace System

{

public delegate void EventHandler(object sender, EventArgs args) ;

public class EventArgs

{

...

}

}

namespace System.Windows.Forms

{

public class Control :

{

public event EventHandler Click;

...

}

public class Button : Control

{

...

}

را رها میکند. این نظم، ایجاد یک نماینده Click بطور اتوماتیک رویداد Button زمانی که روی دکمه کلیک کنید، کلاس

برای یک متد انتخابی و وابسته کردن نمایند ه به رویداد موردنظر را ساده میکند. مثال زیر یک فرم ویندوز را نشان میدهد

را okay_Click به متد okay دکمهی Click و کد اتصال رویداد okay_Click متدی به نام ،okay که یک دکمه به نام

دارد.

class Example : System.Windows.Forms.Form

{

private System.Windows.Forms.Button okay;

...

public Example()

{

this.okay = new System.Windows.Forms.Button();

this.okay.Click += new System.EventHandler(this.okay_Click);

...

}

private void okay_Click(object sender, System.EventsArgs args)

{

// Your code to handle the Click event

}

}

کدی تولید میکند که متدها را به طور اتوماتیک به رویدادها متعهد IDE ،VS.NET مربوط به IDE در هنگام استفاده از

میکند.

mohsen_mahyar@yahoo.com - C# نویسی  برنامه

324

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

با دستور بعدی جایگزین کنید.

this.okay.Click += new System.EventHandler (this.okay_Click);

با

this.okay.Click += this.okay_Click;

GUI 2005 همیشه اولین نسخه را تولید میکند. رویدادهایی که کلاسهای VS با این وجود، محیط طراحی فرمهای ویندوز در

بر void تولید میکنند، همواره الگوی یکسانی دارند. رویدادها از نوع نمایند های هستند که دو پارامتر دارد و مقدار

است. EventArgs میگرداند. اولین آرگومان آن شی رها کنندهی رویداد است و آرگومان دوم یک

اجازه میدهد یک متد برای چندین رویداد استفاده شود. متد مربوطه به نماینده میتواند آرگومان sender آرگومان

را بررسی کرده و به طور مناسب جواب دهد. برای مثال، میتوانید متد یکسانی را برای متعهد کردن دو دکمه به sender

را برای معین کردن دکمهی sender بکار برید. زمانی که رویداد رها میشود، کد متد میتواند آرگومان Click رویداد

کلیک شده استفاده شود.

خلاصه

را نوشته و به دنبال آن نوع مقدار بازگشتی، نام یک نوع delegate • برای اعلان یک نوع داده نمایند ه ، کلمه کلیدی

داده نماینده و پارامترهای آن را بنویسید.

delegate void stopMachineryDelegate();

برای احضار یک نمایند ه به صورت زیر عمل کنید:

;private stopMachineryDelegate stopMachinery

;()stopMachinery

درایجاد یک نمونه از یک نماینده ، آرگومان نمایند ه باید متدی باشد که نشانه آن با نمایند ه منطبق باشد.

this.stopMachinery = new stopMachineryDelegate(folder.stopFolding);

را نوشته و به دنبال آن نوع مقدار بازگشتی و نام رویداد را بنویسید. event • برای اعلان یک رویداد، کلمه کلیدی

public delegate void StopMachineryDelegate();

public event StopMachineryDelegate MachineOverheating;

برای متعهد کردن یک متد، یک نمونه نمایند ه ایجاد کرده و نمونه نماینده را از طریق عملگر =+ به رویداد وابسته

کنید.

tempMonitor.MachineOverheating += welder.FinishWelding;

غیرمتعهد کردن متد از یک رویداد، همانند متعهدکردن است، فقط به جای عملگر =+ از عملگر = - استفاده کنید.

نباشد. null حتماً مطمئن شوید که رویداد موردنظر event • قبل از اجرای یک متد مرتبط با

mohsen_mahyar@yahoo.com - C# نویسی  برنامه

   + MOHSEN GHASEMI - ۱٢:٠۸ ‎ق.ظ ; ۱۳۸٩/٤/٢۳