PDA

View Full Version : سوال: کاربرد delegate در C#‎ چیست؟



mhdsbt
جمعه 05 آبان 1391, 17:07 عصر
سلام
Delegate تو سی شارپ در واقع یه اشاره گر به یه متد هست که میتونه متد رو برام اجرا کنه ولی کی و چه موقع از این مفهوم استفاده میشه و چه مزیتی میتونه داشته باشه؟

nilmil_nil
جمعه 05 آبان 1391, 17:30 عصر
سلام
شما باید براش تعیین کنید که کی این رویداد اجرا بشه
مثل یه button که وقتی روش کلیک می کنید یه متد اجرا میشه
حالا این متد رو شما باید توش کد بنویسید

mhdsbt
جمعه 05 آبان 1391, 21:53 عصر
سلام
شما باید براش تعیین کنید که کی این رویداد اجرا بشه
مثل یه button که وقتی روش کلیک می کنید یه متد اجرا میشه
حالا این متد رو شما باید توش کد بنویسید


اوکی
ولی منظورم این بود که وقتی میشه مستقیم متد رو اجرا کرد چرا از delegate استفاده کنم بعد از طریق متد رو اجرا کنم و این کار اصلا چه مزیتی داره؟

ایمان مدائنی
جمعه 05 آبان 1391, 22:27 عصر
می توان گفت که Delegate يکی از ويژگی های جذاب زبان برنامه نويسی سی شارپ بوده که امکانات بالقوه فوق العاده ای را به اين زبان می افزايد.

Delegate چيست؟

در واقع Delegate کلاسی است که اشياء ساخته شده از آن می توانند توابع ثبت شده (Register) در خود را به ترتيب اجرا نمايند!
، می دانم که اين تعريف کمی وحشت آور است ولی نگران نباشيد تا پايان بحث، موضوع کاملا شيرين خواهد شد.

برای استفاده از Delegate چهار مرحله اصلی وجود دارد که در ذيل، هر مرحله با مثال مشخص خواهد شد:

مرحله اول:

در اين مرحله اقدام به تعريف کلاس Delegate می کنيم:

public delegate void MyDelegate(int n);

معنی عبارت فوق اين است که ما می خواهيم يک کلاس Delegate تعريف کنيم که اشياء آن بتوانند توابعی را در داخل خود ثبت کنند که پارامتر ورودی آنها يک عدد صحيح (int n) بوده و پارامتر خروجی (void) نداشته باشند.

برای روشن شدن مطلب کلاسی به نام Employee و به شکل ذيل تعريف می نماييم:

public class Employee
{
public int Age;
public string FullName;

public Employee(string fullName, int age)
{
Age = age;
FullName = fullName;
}

public void DoIt(int n)
{
System.Console.WriteLine("I'm " + FullName + ", I did it " + n + " times .");
}
}

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

مرحله دوم:

در اين مرحله نسبت به ايجاد يک شیء از کلاس MyDelegate اقدام می کنيم:

MyDelegate DelegateInstance;

در اين دستور، ما يک شیء به نام DelegateInstance از کلاس (MyDelegate) تعريف نموده ايم.
حال برای ادامه مسير، از کلاس Employee يک شیء به نام oEmployee به شکل ذيل ايجاد می کنيم:

Employee oEmployee = new Employee("iman Madaeny", 24);

مرحله سوم:

در اين مرحله تنها کافی است که تابع (متد) DoIt شیء oEmployee را در شیء DelegateInstance به شکلی که در ذيل ذکر گرديده است ثبت نماييم:

DelegateInstance = new MyDelegate(oEmployee.DoIt);

و اما مرحله چهارم (مرحله آخر):

در اين مرحله با صدا زدن (Call) شیء DelegateInstance همراه با يک پارامتر عددی، تابع ثبت شده در داخل آن به همان پارامتر عددی مشخص شده اجرا می شوند. دقت کنيد که در اين مثال تنها يک تابع ثبت شده در داخل شیء Delegate وجود دارد.

DelegateInstance(5);

کاملا واضح است که به راحتی می توانستيم پس از ايجاد شی، oEmployee، با اجرا کردن تابع Doit همراه با همان پارامتر عددی، به همان نتيجه نائل آييم. ولی دقت کنيد که هميشه اين چهار مرحله به اين شکلی که در اينجا مطرح گرديده است در کنار هم قرار نمی گيرند. نکته جالبی که در اين فنآوری وجود دارد اين است که در يک پروژه واقعی، اين چهار مرحله، هر کدام در يک قسمت از برنامه تعريف و بکارگرفته می شوند و اين مساله امکانات بسيار مفيد و جذابی را برای زبان برنامه نويسی سی شارپ به ارمغان می آورد.

p.yazdkhasti
جمعه 05 آبان 1391, 23:53 عصر
دلایل و موارد استفاده از Delegate به صورت خلاصه در لینک زیر توضیح داده شده است:
http://devnet.ir/blog/blog-post/devnet/2012/10/26/%D8%AF%D9%84%D8%A7%DB%8C%D9%84-%D9%88-%D9%85%D9%88%D8%A7%D8%B1%D8%AF-%D8%A7%D8%B3%D8%AA%D9%81%D8%A7%D8%AF%D9%87-%D8%A7%D8%B2-delegate

r_s1389@yahoo.com
یک شنبه 07 آبان 1391, 16:35 عصر
سلام
من در اینجا یک کتاب در مورد delegate میذارم امیدوارم که مفید واقع شود بلکه به درد یک بنده خدایی خورد
http://uplod.ir/hbabl7n877zl/Delegate.pdf.htm

shahabp
چهارشنبه 02 اسفند 1391, 12:09 عصر
وقتی میشه مستقیم متد رو اجرا کرد چرا از delegate استفاده کنیم؟

intel_amd
چهارشنبه 02 اسفند 1391, 17:30 عصر
برای زیبائیه و خوانائیه کده که دیگه ننویسین
oEmployee.DoIt(5) و بجاش فقط بنویسین
DelegateInstance(5);
اما با ارث بری هم میشه فقط نوشت
Doit(5) برا همین برام درست معلوم نیست به چه درد میخوره:متفکر:

wolf_majid
چهارشنبه 02 اسفند 1391, 18:08 عصر
وقتی میشه مستقیم متد رو اجرا کرد چرا از delegate استفاده کنیم؟

یکی دیگر از دلایل استفاده :
معمولا" زمانی مورد استفاده قرار میگیره که بخواهید یک متد را به عنوان ورودی متد دیگر ارسال کنید
در حالت عادی این کار امکان پذیر نیست ولی با Delegate ها میشه

website.expert
چهارشنبه 02 اسفند 1391, 19:08 عصر
سلام
من در اینجا یک کتاب در مورد delegate میذارم امیدوارم که مفید واقع شود بلکه به درد یک بنده خدایی خورد
http://uplod.ir/hbabl7n877zl/Delegate.pdf.htm
سلام،
دوست عزیز من نتونستم دانلود کنم،
لطف کنید لینک سالمش رو بذارید.
ممنون.

r_s1389@yahoo.com
چهارشنبه 02 اسفند 1391, 19:52 عصر
سلام،
دوست عزیز من نتونستم دانلود کنم،
لطف کنید لینک سالمش رو بذارید.
ممنون.
http://uplod.ir/lz27xqw2hn0g/Delegate.pdf.htm

intel_amd
چهارشنبه 02 اسفند 1391, 21:10 عصر
یکی دیگر از دلایل استفاده :
معمولا" زمانی مورد استفاده قرار میگیره که بخواهید یک متد را به عنوان ورودی متد دیگر ارسال کنید
در حالت عادی این کار امکان پذیر نیست ولی با Delegate ها میشه

میشه یک مثال بیارید؟

shahabp
چهارشنبه 02 اسفند 1391, 21:51 عصر
از delegate کجا و چه وقت باید استفاده کرد؟

WiseWoman_2013
پنج شنبه 30 آبان 1392, 19:08 عصر
میشه یک مثال بیارید؟

ارسال پارامترهای لاگین به کلاس program و کنترل athenticate


public partial class frmLogin : Form

{
public event LoginHandler Login;

public frmLogin()
{
InitializeComponent();
}

private void btnLogin_Click(object sender, EventArgs e)
{
Login(txtUsername.Text, txtPassword.Text);
Close();
}
}


استفاده از تابع لاگین در کلاس program


frmLogin Frm = new frmLogin();
Frm.Login += Frm_Login;
Frm.ShowDialog();
if(Authenticated)
Application.Run(new frmMain());
else
MessageBox.Show("Invalid !");
}

static void Frm_Login(string username, string password)
{
SqlCommand Command = new SqlCommand("SELECT dbo.UDF_Authenticate(@Username,@Password)",new SqlConnection("data source=.;database=Session2;uid=sa;pwd=sql"));
Command.Parameters.Add("@Username", System.Data.SqlDbType.VarChar, 50).Value = username;
Command.Parameters.Add("@Password", System.Data.SqlDbType.VarChar, 50).Value = password;
Command.Connection.Open();
Authenticated = Convert.ToBoolean(Command.ExecuteScalar());
Command.Connection.Close();
}

البته این استفاده ساده از پارامتر های ارسالی فرم لاگین است و صرفا جهت نشان دادن ارسال متد به متد توسط delegate

winner1
پنج شنبه 30 آبان 1392, 19:18 عصر
دوست خوب مفهوم Delegate یعنی : فراخوانی اجرای یه متد ببین به فرض کلاس باتون یه رویداد داره به اسم کلیک شما می گی چرا من متدی که قراره موقع کلیک شدن یه باتون اجرا کنم رو مستقیم اجرا نمی کنم یه سوال کلاس باتون از کجا باید بدونه که کدوم متد رو مستقیم اجرا کنه ؟ پس میاد یک عامل تعریف می کنه و هر جا که لازم بود متدی اجرا بشه اون رو به اون عامل اضافه می کنیم
کاربرد دیگش واسه جایی که ما از یه عامل به عنوان پارامتر ورودی استفاده کنیم مثلا فرض کن یه کتابخانه نوشتی که یه کلاس داره که وظیفش جستجو تو بانک و یه جدول خاصه ولی نحوی جستجو رو می خوای بعدن مشخص کنی پس میای واسه متدی که داره عمل جستجو رو انجام میده یه پارامتر از نوع یه تابع تعریف می کنی که نحوی جستحجو رو مشخص کنه.

علی متقی پور
جمعه 01 آذر 1392, 02:48 صبح
با سلام

یکی از کاربردهای مهم دیلیگیت که دوستان اشاره ای به اون نداشتن در مورد بحث لایه بندی پروژه و استقلال لایه ها از همه. شما بفرض در لایه بیزینست به جای اینکه متدی از لایه دیگر رو بطور مستقیم صدا بزنی ( و به نوعی به اون وابسته بشی) با تعریف دیلیگیت کاملا از اون متد مجزا میشی و بفرض اگر روزی اون متد عوض شد یا تغییر نام داد کد شما آسیبی نمیبینه

البته طبیعتا توضیح این مطلب در اینجا کمی مشکله. توصیه من اینه که کتاب آموزش asp.net MVC مهندس راد رو بخونید خصوصا بخش تزریق وابستگی

saffarpour
جمعه 01 آذر 1392, 16:22 عصر
از Delegate برای زمانی که قرار است یک سری عملیات بعداز انجام شدن یک متد در کلاس A در کلاس B که یک شی از کلاس A تعریف کرده است انجام شود استفاده میشود،بهترین مثال برای آن متد Click در Button می باشد.
وقتی که یک Button را تعریف میکنیم،اعلام میکنیم که وقتی بر روی آن Click شد چه عملیاتی انجام شود.

csharpdoost
شنبه 02 آذر 1392, 15:39 عصر
http://uplod.ir/lz27xqw2hn0g/Delegate.pdf.htm
لینک مشکل داره بی زحمت میشه دوباره لینک رو چگ کنید. ممنون

r_s1389@yahoo.com
سه شنبه 26 آذر 1392, 11:03 صبح
اینم از لینک جدید
http://uplod.ir/ko2xzzd3sup6/delegate.rar.htm