PDA

View Full Version : سوال: raise کردن یعنی چی؟



vahid.bz
پنج شنبه 10 اردیبهشت 1388, 15:08 عصر
لطفاً کاربرد و مثال و توضیح با هم باشند
ممنون

prankster
پنج شنبه 10 اردیبهشت 1388, 16:27 عصر
این مفهومی است که در ارتباط با وقفه ها بکار برده می شود. در برنامه های عادی معمولا نیازی به تعریف وقفه نیست. اما در برنامه هایی که برنامه نویس نیاز به کنترل عمیق تری بر روی اجزای برنامه دارد تعریف event اجتناب ناپذیر است، مثلا در ارتباط با سرور یا file system و یا نوشتن component، به این صورت که برنامه که شما نوشته اید باید به نحوی قسمتهای دیگر برنامه که را از اجرای قسمتی از کد خود مطلع کند. به این عمل raise کردن وفقه می گویند.
فرض کنید شما در حال نوشتن کدی هستید که برای ایجاد یک Button لازم است، به نوعی component از نوع Button را شما می نویسید. Button وقتی کاربرد دارد که کلیک شدن روی آن قابل برنامه ریزی باشد. شما در برنامه Button می دانید هنگامی که دکمه چپ موس بر روی قسمتی از گرافیک که شما آن را کشیده اید فشرده می شود به معنی کلیک است، ولی هرگر نمی دانید کسانی که می خواهند از برنامه Button شما استفاده کنند قصد چه کاری هنگام کلیک کردن دارند. بنابراین در برنامه خود وقفه از جنس کلیک را تعریف می کنید و هنگامی که موس در چهارچوب تعریف شده فشرده شد اصطلاحا آن وقفه را raise میکنید. به این صورت کسانی که از برنامه شما استفاده می کنند مطلع می شوند که بر روی Button کلیک شده است.
تعریف و کاربرد event ها نیاز به درک مفهوم delegate و event model در #C دارد. پیشنهاد می کنم اگر فرصت دارید در مورد آنها تحقیق کنید. در هر حال اگر لازم است بگویید مثالی در این مورد بنویسم

zahra111
جمعه 11 اردیبهشت 1388, 13:04 عصر
تعریف و کاربرد event ها نیاز به درک مفهوم delegate و event model در #C دارد. پیشنهاد می کنم اگر فرصت دارید در مورد آنها تحقیق کنید. در هر حال اگر لازم است بگویید مثالی در این مورد بنویسم[/quote]

لطفا delegate , event model رو با مثال توضیح بدین.

vahid.bz
جمعه 11 اردیبهشت 1388, 13:46 عصر
سلام
delegate ها اشاره گری هستند به یه متدی توی برنامه ما.البته با شرایط زیر:

delegate ما برای اشاره به اون متد باید نوع بازگشتی خودش و پارامتر های خودش با اون متده دقیقا یه جور باشن.خب اولا بگم نحوه تعریف delegate چه جوریه.بطور خیلی ساده syntax مثل زیر هست:

< modifier > delegate < returnType> nameOfDelegate ( < parameters > ) ;

1.modifier ما میشه همون تعیین سطح دسترسی delegate مون.یعنی public باشه یا private باشه و ....
2.delegate نام نوع داده ای ما هست.مثل int یا float یا ...
3.return type میشه نوع بازگشتی delegate ما که در واقع باید این نوع بازگشتی همون نوع بازگشتی متدی باشه که قراره این delegate ما به اون اشاره بکنه.نوع بازگشتی میتونه int یا float یا ... باشه.
4.nameOfDelegate میشه اسمی که ما به دلخواه به delegate مون میدیم.چه جوری مثلا توی int x ، میگیم که x نام دلخواهی هست.اینجا هم یه نام برای delegate تعریف می کنیم.
5.parameters میشه پارامتر های delegate ما که این قسمت هم باید دقیقا با پارامترهای اون متدی که قراره delegateمون بهش اشاره کنه یکی باشه.
و حالا یه مثال فرض کنید متدی که می خواهیم delegate مون بهش اشاره کنه اسمش MyMethod هست و به شکل زیر هست:

int MyMethod ( int x , int y)
{
return x + y ;
}

خب حالا ببینیم که اگه بخواهیم delegate ایی بسازیم که به این متد اشاره کنه چه جوری باید تعریف بشه:

public delegate int MyDelegate ( int param1 , int param2 ) ;

همونطور که می بینید نوع پارامتر ها و نوع بازگشتی delegate ها دقیقا عین متد MyMethod هست.خب یه سوالی که میتونیم بپرسیم اینه که خب حالا با این کار چه اتفاقی افتاد؟
در جواب این سوال باید بگم که الان ما انگار یه نماینده ای در نظر گرفتیم برای یکی دیگه.متد MyMethod برای خودش الان نماینده ای میتونه داشته.تاکید میکنم میتونه داشته باشه هنوز نداره .منظورم از نماینده اینه که می میتونیم بجای متد MyMethod از نماینده اش یعنی MyDelegate استفاده کنیم.خب بریم ببینیم چه جوری میشه یه نماینده برای متد MyMethod در نظر گرفت.
در واقع الان می خوام کد فعال سازی delegate مون رو بنویسم:

< nameOfDelegate > variableName = new < nameOfDelegate > ( MethodName ) ;

خب بیاین تک تک بررسی کینم:
1.nameOfDelegate میشه اسم delegate ای که قبلا ساختیم.
2.variableName میشه اسیم یه متغیری که باید برای فعال سازی delegate مون بسازیم.بعدا از طریق این متغیر هست که میتونیم به delegate مون پارامتر بفرستیم.
3.new < nameOFDelegate در واقع این چگونگی فضادهی در حافظه به متغیرمون هست که باید همینطوری نوشته بشه.من وارد مباحث فرعی نمی شم و در همین حد توضیح میدم چون این قسمت مربوط به مباحث شی گرایی هست که ربطی به بحث فعلیمون نداره.
4.MethodName میشه اسم متدی که delegate مون میخواد نماینده اون بشه.یعنی بجای اون بکار بره.یا خیلی تخصصی بخواهیم بگیم چنین میگیم:MethodName نام متدی خواهد بود که متغیر delegate ما آدرس اون متد را در خود خواهد داشت.
برای مثال قبلی خودمون اگه بخواهیم delegate مون نماینده ی MyMethod بشه باید کد زیر رو بنویسیم:

MyDelegate obj = new MyDelegate ( MyMethod ) ;

در اینجاست که میتونیم به جرات بگیم که delegate ما که از این بعد obj میشه همه کاره ی اون ، نماینده ی MyMethod هست.


مرحله بعدی مرحله استفاده از این delegate هست.برای استفاده خیلی راحت فرض کنید متد MyMethod اسم دیگش یا مستعارش obj هست.شما از MyMethod میتونید توی برنامتون ازش اینطوری استفاده کنید:

int result = MyMethod ( 2 , 4 ) ;
Console.WriteLine ( result.ToString( ) ) ;

خب حالا ببینیم نماینده این متد را چه جوری استفاده می کنن:

int result = obj( 2 , 4 ) ;
Console.WriteLine ( result.ToString ( ) ) ;

همینطور که می بینید طریقه استفاده ی هر دو یکی هست.این هم از مبحث delegate ها.راستی توی Delegate توی انگلیسی یعنی "نماینده".
یه مطلبی که داشت یادم میرفت اینه که شما اگه بخواین یه متدی رو به عنوان پارامتر به یه متد دیگه بفرستین نمی تونین.چاره کار استفاده از نماینده یا همون delegate هست.یه مثال در این باره:مثال زیر یه windows application هست:

using System;
using System.Windows.Forms ;
namespace MyDelegateSample
{
public delegate int myDelegate ( int param1, int param2 );
public partial class Form1 : Form
{
public Form1 ( )
{
InitializeComponent ( );
}


int MyMethod ( int x , int y )
{
return x + y ;
}


void NextMethod ( MyDelegate delVariable )
{
MessageBox.Show( delVariable( 2 , 4 ).ToString( ) );
}


private void Button_Clicked (object sender , EventArgs e)
{
MyDelegate myDel = new MyDelegate( MyMethod );
NextMethod( myDel );
}
}
}

نتیجه اجرای این برنامه این است که با کلیک بر روی دکمه نتیجه 4+2 یا همون 6 نشون داده میشه.
برنامه رو خودتون تحلیل کنین اگه مشکلی داشتید توی قسمت نظرات بیان کنید. موفق و سر بلند باشید.
این مطلب از آقای نعیم آبادی می باشد.با تشکر از ایشان.

zahra111
یک شنبه 13 اردیبهشت 1388, 19:04 عصر
خیلی ممنونم. توضیحاتتون خیلی عالی بود. می خوام بدونم کاربرد delegate فقط برای ارسال یه متد به عنوان پارامتر به یه متد دیگه است؟
میشه در مورد event model هم یه توضیحی بدین؟

vahid.bz
جمعه 18 اردیبهشت 1388, 10:03 صبح
کاربرد delegate
تا جایی که من می دونم (که مطمیناً همش این نیست) مهمترین کار بردش فرا خوانی چند تابع به صورت همزمان است.
فرض کنید داریم:

public delegate void MyDelegate(string myString);
private void MyMethod(string someString)

با استفاده از کده زیر میتوانیم از یک Delegate نمونه بگیریم و یک متد را به Invocation List آن اضافه کنیم:

MyDelegate del = new MyDelegate(MyMethod);


del += new MyDelegate(MyOtherMethod);
برای فراخوانی آن متد (و کل Invocation List ) کافیست بنویسیم:

del("vahid");
با این کار دو تابع شما (mymethod and myothermethod)که signatureانها با delegateیکیست هردو با هم اجرا می شوند.

hozouri
سه شنبه 23 تیر 1388, 10:52 صبح
< modifier > delegate < returnType> nameOfDelegate ( < parameters > ) ;

1.modifier ما میشه همون تعیین سطح دسترسی delegate مون.یعنی public باشه یا private باشه و ....
3.return type میشه نوع بازگشتی delegate ما که در واقع باید این نوع بازگشتی همون نوع بازگشتی متدی باشه که قراره این delegate ما به اون اشاره بکنه.نوع بازگشتی میتونه int یا float یا ... باشه.


من تا اونجایی که اطلاع دارم Delegate فقط void می تونه باشه برای این گفته منبع معتبری دارید ؟؟؟:اشتباه:

vahid.bz
سه شنبه 23 تیر 1388, 11:20 صبح
از سایت naimabadi.blogfaمن این مطالب و گفتم
و یک سایتی که یادم نیست گفتم
توی مقاله ای خارجی هم اعلام شده که هم میشه رvoid برگردونه هم غیرvoidمنتها باهم تفاوتایی دارن

Unknownlive
پنج شنبه 25 تیر 1388, 09:22 صبح
با سلام ، یعنی چی که Delegate به عنوان نوعی از پارامتر وردودی یک تابع دیگه استفاده می شه در ضمن کاربرد ان در رویداد را اگه میشه توضیح دهید با تشکر

vahid.bz
پنج شنبه 25 تیر 1388, 11:00 صبح
هر رویدادی تعدادی تابع داره که وقتی رویداد فراخوانی می شه در واقع تابع های اون که همشون یک signatureدارن اجرا میشن
قبل از اینکه یک رویداد تعریف بشه بایدsignatureتابع هایی رو که رویداد می پذیره مشخص کنی که وظیفه ی این کار بر عهده ی delegateمی باشد.
من وقتی می نو یسم:

public delegate void MyDelegate(string myString);
یعنی رویدادی یا رویدادهایی که بعدآ تعریف می کنم باید تابع هایی که voidبرمی گردونه وstring میگیره جزو تابع های رویداد باشند
حالا یه مثال ساده با هم بررسی می کنیم.
یهbuttonتوی فرمم میذارم و رویداد کلیکشو ایجاد می کنم یه textBoxهم بذار
در کلاس خود فرم (توی تابع ها نه) کد زیرو مینویسی:

public delegate void _ShowInTextBox(Object sender, EventArgs e);
یعنی:می خوام رویدادی بعدآ تعریف کنم که با riseشدنش تابع هایی با signatureبالارومیپذیره
زیر کد قبلی کد پایین رو بنویس

public event _ShowInTextBox ShowInTextBox;
حالا یه رویدادداری داریم که با riseشدنش تابع هایی که بعدآ به اون اضافه می کنیم اجرا میشن.
توی رویداد کلیک buttonکد زیرو بنویس

ShowInTextBox += new _ShowInTextBox(AddInTextBox);
با این کد یه تابع با نام AddInTextBoxبه رویدادShoeInTextBoxاضافه کردیم
زیر همون کد زیرو بنویس

ShowInTextBox(this, e);
این یعنی رویداد riseبشه به عبارتی تابع های اون اجرا شه
اینم تابع

public void AddInTextBox(Object sender, EventArgs e)
{
textBox1.Text = "Rising Event";
}

خود برنامم برات گذاشتم

tara_sh500
پنج شنبه 05 شهریور 1388, 14:48 عصر
دو نوع Delegate داریم. delegate و multiCast Delegate . ;i ; که delegate میتونه هر نوعی رو return کنه، ولی multiCast Delegate فقط void برمیگردونه.
منبع : سایت codeProject.com

saeid.scorp
یک شنبه 08 شهریور 1388, 17:31 عصر
البته قبل از فراخوانی رویداد ها باید بررسی کنیم ببینیم آیا متدی در لیست رویداد وجود داره یا نه!
به این صورت:

(if(<eventname>!=null
;()<eventname>