PDA

View Full Version : سوال: یک مثال از قابلیت منحصر به فرد دلگیتها



میلاد قاضی پور
جمعه 26 شهریور 1389, 19:16 عصر
سلام . در مورد دلگیتها مدتی هست دارم مطالعه میکنم اما به هیچ وجه نمیتونم درک کنم که چه کاری هست که توسط کدهای قابل فهم تر و راحت تر نمیشه نوشت که با دلگیت میشه . در واقع اگر مثالی بزنید که برام جا بیفته که مأموریت مهم دلگیت چی هست خیلی کمکم کردید .

صباح فتحی
جمعه 26 شهریور 1389, 19:18 عصر
بله .اصلا بگید دلیگیت چیه؟کاربردش چیه...ممنونیم

flash118
جمعه 26 شهریور 1389, 19:34 عصر
با سلام خدمت هر دو تا دوست گلم
آقا یه نمونه سورس گذاشتم البته ببخشید با عجله شد سعی کردم نمونه کاری با deleget رو بیان کنم امیدوارم روشن کننده کار باشه الته نمونه سورس کوچک هست و بیان گر آسونی و قدرت deleget نیست ولی برای شروع گفتم دیدنش خالی از لطق نیست

afsharjowkar
جمعه 26 شهریور 1389, 21:29 عصر
این یکی از پست های بلاگ خودمه ، یه نیگاه بنداز کمکت می کنه

http://www.oopc.mihanblog.com/post/22

Sajjad.Aghapour
جمعه 26 شهریور 1389, 21:32 عصر
مثال های زیادی میشه در این رابطه زد.برای مثال شاید به نحوه تعریف یک Event و یا Asynchronous Multithreading و ... اشاره کرد
مثال ساده ای که این مسئله رو براتون روش کنه به ذهنم نرسید.

فرض کنید یک کلاس دارید که برای کار بر روی رشته ها نوشتید.میخواهید به محض اینکه مقدار رشته اصلی (برای مثال طول رشته تغییر کرد) یک کاری انجام بشه.
کلاس رو به این صورت تعریف میکنیم:

public class MyClass
{
private string mainString;

public delegate void LengthChangeEventHandler();
public event LengthChangeEventHandler LengthChanged;

public string MainString
{
get
{
return mainString;
}
set
{
mainString = value;
this.OnLengthChange();
}
}

protected virtual void OnLengthChange()
{
if (this.LengthChanged != null)
{
this.LengthChanged();
}
}
}


اما این کد اصلا چه کار میکنه:
mainString رشته اصلی ما هستش که با استفاده از خاصیت MainString به اون دستیابی دارم
LengthChangeEventHandler نشان دهنده و نماینده یک Event برای LengthChanged
و OnLengthChange یک متد است که هنگام Raising رویداد مورد نظر اون رو پیاده سازی میکنه

به محض اینکه ما خاصیت MainString را در جایی مقداردهی کنیم، در بخش Set این مقدار به mainString نسبت داده میشه و متد OnLengthChange فراخوانی میشه.یعنی در اصل رویداد ما Fire میشه...

نحوه استفاده :

private void btn_Click(object sender, EventArgs e)
{
MyClass c = new MyClass();
c.LengthChanged += new MyClass.LengthChangeEventHandler(c_LengthChanged);
c.MainString = "test";
}

private void c_LengthChanged()
{
MessageBox.Show("Main string changed");
}


این یک مثال ساده بود که البته نمیدونم تا چه حد مطلب رو برای شما روشن کرد.اما میتونید همین اطلاعات کم رو بسط بدید و تا نوشتن یک کلاس پیشرفته و استفاده از Event Args و Customize کردن آرگونهای اون پیش برید..

همچنین استفاده از Delegate ها در Thread Invoking و ...

موفق باشید/

s.khoshfekran
جمعه 26 شهریور 1389, 21:32 عصر
من تو پست هاي قبلم آموزش فارسي Delegate رو گذاشته بودم!! يه سرچ تو پستام بزن ببين شايد بتوني پيدا كني!

میلاد قاضی پور
شنبه 27 شهریور 1389, 09:51 صبح
با تشکر از همه دوستان بویژه sajjadlove که نکات مهمی رو از مثالش متوجه شدم که تا حالا نمیدونستم .
سوألی که پیش میاد اینه که خود دلگیت دقیقا چه کاری انجام میده . من مثالهای بسیار بسیار زیادی رو بررسی کردم . هر کتابی داشتم در مورد دلگیتها بهش رجوع کردم . از دو تا کتاب واقعی و چند ایبوک بدقت بررسی هایی کردم تا اینو درک کنم که خود دلیگیت چیکار میکنه . در نهایت برداشت من این بود که دلگیت مثل خشابی از متدهاست که به موقع اونها رو اجرا میکنه . اما باز نمیتونم درک کنم وقتی میشه آرایه ای از اشیا و متدها رو هم ایجاد کرد یا از سوئیچ کیس در مواردی استفاده کرد چرا از دلگیتها استفاده میشه ؟ این سوأل از بعد کنجکاوی پرسیده میشه نه اینکه فکر کنم چیز بیهوده ای هستن . اگر لطف کنید شفاف تر توضیح داده بشه ممنون میشم .

fjm11100
شنبه 27 شهریور 1389, 10:02 صبح
ببین بطور خیلی ساده و خلاصه delegate یک ارجاع یا رفرنس است به متد. در جاهایی که مستقیما نمیتونی خود متد را صدا بزنی با delegate به متد ارجاع میدی.

اَرژنگ
شنبه 27 شهریور 1389, 10:18 صبح
ببین بطور خیلی ساده و خلاصه delegate یک ارجاع یا رفرنس است به متد. در جاهایی که مستقیما نمیتونی خود متد را صدا بزنی با delegate به متد ارجاع میدی.

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

میلاد قاضی پور
شنبه 27 شهریور 1389, 10:19 صبح
ببین بطور خیلی ساده و خلاصه delegate یک ارجاع یا رفرنس است به متد. در جاهایی که مستقیما نمیتونی خود متد را صدا بزنی با delegate به متد ارجاع میدی.
دوست عزیز ممنونم از توجهتون اما اینها تعاریف کلیشه ای موجود در کتابها هستند . اینشتین جمله ی زیبایی داره که میگه :

تا وقتی که مطلبی رو نتونید به مادر بزرگ خودتون یاد بدید یعنی خودتون هم اونو درست متوجه نشدید

اَرژنگ
شنبه 27 شهریور 1389, 10:26 صبح
دوست عزیز ممنونم از توجهتون اما اینها تعاریف کلیشه ای موجود در کتابها هستند . اینشتین جمله ی زیبایی داره که میگه :

تا وقتی که مطلبی رو نتونید به مادر بزرگ خودتون یاد بدید یعنی خودتون هم اونو درست متوجه نشدید

نه، سادگی هم حدی دارد، مادربزرگ انیشن شاید فیزیک بلد بوده باشد ولی کمتر مادر بزرگی الان ایده‌هایه ساده برنامه نویسی را میتونه درک کند.
در مورد چیزی که گفته شد، کلیشه نیست، درک حداقل یک سطح نیاز است. اگر به همان جمله به اینکه سعی کردن چی بگن نگاه بندازید و درکش کنید میبینید از همان ساده‌تر نمیشه بیان کرد.

mahboube
شنبه 27 شهریور 1389, 10:33 صبح
اين يه مثال خيلي كاربرديه!!از Delegate ها!
براي استفاده از يك wpf , usercontrol توي پروژه.
http://barnamenevis.org/forum/showthread.php?t=169622

پ.و.عمرا حتي خود برنامه نويس طراح سي شارپ هم بتونه به هيچ مادر بزرگي مطلبي از سي شارپ رو ياد بده(محض مزاح بود!)

میلاد قاضی پور
شنبه 27 شهریور 1389, 10:43 صبح
من بالاخره این موضوع رو کامل یاد میگیرم شده تا آخر روز یا شیش ماه دیگه و اون موقع با اجازه بزرگترا بله ... میام و توضیح میدم تا ببینید چند تا مادر بزرگ برنامه نویس میشه به جامعه تحویل داد . مادر بزرگای زمان اینشتین الفبا بلد نبودن اما مادر بزرگای امروزی ماشالله یاور هرچی دیجیت پیجیت و تکنولوژی و موبایل و کامپیوتر و .. رو استاد میکنن پس فرقی نمیکنه . به هر حال از همه مچکر .

fjm11100
شنبه 27 شهریور 1389, 11:30 صبح
دوست عزیز ممنونم از توجهتون اما اینها تعاریف کلیشه ای موجود در کتابها هستند . اینشتین جمله ی زیبایی داره که میگه :

تا وقتی که مطلبی رو نتونید به مادر بزرگ خودتون یاد بدید یعنی خودتون هم اونو درست متوجه نشدید

اگر یک نگهای به جوابهای من در پاسخ به سوالات دوستان (از جمله خود شما در چند پست) بیاندازید میبینید من همیشه سعی کردم پاسخهای اول را تک جمله ای و ساده بگویم چرا؟
1- طرف با دیدن یک مشت کد عجیب و غریب یا اصطلاحات پیچیده ای که تعریف کامل هر کدام 10 صفحه مطلب بخواد وحشت نکنه
2- درگیر جزئیات شاید بی ارتباط با موضوع نشه کلیت موضوع را راحت متوجه بشه و بتونه خودش بره دنبالش (اینجوری عمیقتر یاد میگیره تا بخوای یک راست کد مورد نظرش را بدی بهش)
در مورد سوال شما هم توضیح همان یک خطی بود که دادم حالا اگر میخواهید راجع به این مطلب بیشتر توضیح بدم. اما موارد کاربردی ( Multithreading و Events و Remoting و ....) هر کدام یک کتاب می توانند باشند (خواستی اسم کتابهاشم میدم)
راستی خدای ناکرده فکر نکنی ادعایی دارم اما تا جایی که من مطالعه کردم میدونم هنوز چیزهایی از همین مباحث هست که حتی به گوش منی که 5 سال دات نت و 8 سال برنامه نویسی میکنم نخورده
--------------------

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

میلاد قاضی پور
شنبه 27 شهریور 1389, 12:33 عصر
در مورد سوال شما هم توضیح همان یک خطی بود که دادم
دوست من من به شما خیلی ارادت دارم و منظورم این نبود که جواب شما ارزش نداشت اتفاقا شما بسیار خوب دلگیت رو تعریف کردید . اما جواب مورد نظر من اون نبود . من تعریف دلگیتها رو حفظم و یواش یواش باتکرار خوندن فصل مربوط به دلگیت و ایونت دارم اون قسمت از کتاب رو هم حفظ میشم . اما هر جور حساب میکنم میبینم اون کار رو به شکل ساده تر و بهتر هم میشه انجام داد . جوابی که من میخوام یک مثال از قابلیت منحصر به فرد دلگیتها هست .





1- طرف با دیدن یک مشت کد عجیب و غریب یا اصطلاحات پیچیده ای که تعریف کامل هر کدام 10 صفحه مطلب بخواد وحشت نکنه
2- درگیر جزئیات شاید بی ارتباط با موضوع نشه کلیت موضوع را راحت متوجه بشه و بتونه خودش بره دنبالش (اینجوری عمیقتر یاد میگیره تا بخوای یک راست کد مورد نظرش را بدی بهش)

1-شاید به اندازه یه کتاب 100 صفحه ای مطلب و کد رو در این مورد رو مو به مو واو به واو بررسی کردم وحشت چرا؟
2- یک مثال خواستم که فقط دلگیتها میتونن انجام بدن

اَرژنگ
شنبه 27 شهریور 1389, 12:51 عصر
جوابی که من میخوام یک مثال از قابلیت منحصر به فرد دلگیتها هست .

2- یک مثال خواستم که فقط دلگیتها میتونن انجام بدن

چنین چیزی وجود ندارد، هر مثالی که کار بخصوصی را با دلگت انجام بده را میشه بدونه دلگت و به یک شکل دیگر بازسازی کرد (شاید با یکمی مشکلات و زشتی کد).

میلاد قاضی پور
شنبه 27 شهریور 1389, 12:57 عصر
چنین چیزی وجود ندارد، هر مثالی که کار بخصوصی را با دلگت انجام بده را میشه بدونه دلگت و به یک شکل دیگر بازسازی کرد (شاید با یکمی مشکلات و زشتی کد).
این نقل قول از کتاب C#‎‎2008 هست . یه نمونه از کاری که فقط دلگیتها میتونن انجام بدن . اما مشکل اینه که کار اصلیش این نیست .



by a delegate throws an exception, the complete iteration stops. Have a look at the following
MulticastIteration example. Here, a simple delegate named DemoDelegate that returns void
without arguments is defined. This delegate is meant to invoke the methods One() and Two() that
fulfill the parameter and return type requirements of the delegate. Be aware that method One() throws
an exception.


using System;
namespace Wrox.ProCSharp.Delegates
{
public delegate void DemoDelegate();
class Program
{
static void One()
{
Console.WriteLine(“One”);
throw new Exception(“Error in one”);
}
static void Two()
{
Console.WriteLine(“Two”);
}


In the Main() method, delegate d1 is created to reference method One() ; next, the address of method
Two() is added to the same delegate. d1 is invoked to call both methods. The exception is caught in a
try / catch block.


static void Main()
{
DemoDelegate d1 = One;
d1 += Two;
try
{
d1();
}
catch (Exception)
{
Console.WriteLine(“Exception caught”);
}
}
}
}


Only the first method is invoked by the delegate. Because the first method throws an exception, iterating
the delegates stops here and method Two() is never invoked. The result might differ because the order
of calling the methods is not defined.
One
Exception Caught
Errors and exceptions are explained in detail in Chapter 14 , “ Errors and Exceptions. ”
In such a scenario, you can avoid the problem by iterating the list on your own. The Delegate class
defines the method GetInvocationList() that returns an array of Delegate objects. You can now use
190
Part I: The C#‎‎ Language
this delegate to invoke the methods associated with them directly, catch exceptions, and continue with
the next iteration:


static void Main()
{
DemoDelegate d1 = One;
d1 += Two;
Delegate[] delegates = d1.GetInvocationList();
foreach (DemoDelegate d in delegates)
{
try
{
d();
}
catch (Exception)
{
Console.WriteLine(“Exception caught”);
}
}
}


When you run the application with the code changes, you can see that the iteration continues with the
next method after the exception is caught:

One
Exception caught
Two

fjm11100
شنبه 27 شهریور 1389, 12:58 عصر
مثال های خوبی در خود msdn وجود دارد.
به عنوان مثال شما بخش رویدادها را مطالعه کنید و سعی کنید یک رویداد بدون delegate بنویسید!
یا در remoting می بینید که برای نوشتن کلاینت از delegate استفاده کرده حالا شما سعی کنید بدون delegate بنویسید!!
یا چرا راه دور بریم همین متد Invoke کنترلها که در multithreading اینترفیس بسیار حیاتی است از delegate برای ارجاع به متدی که در ترد جداگانه ای کار میکند استفاده شده
--------------------

استفاده شده
ببخشید استفاده میشود!!

ASKaffash
شنبه 27 شهریور 1389, 13:42 عصر
سلام
یک مثال واقعی و محاسباتی از کاربرد Delegate :
فرض کنیم هدف تولید Componet ای است که با روش رانج کوتا قرار است مقدار انتگرال معین هر تابع ریاضی را محاسبه کند در اینجا دریافت تابع Fx می تواند توسط یک Delegate انجام شود و به نظرم راه دیگری متصور نیست

ASKaffash
شنبه 27 شهریور 1389, 14:42 عصر
ممنون از شما اما کدش چی ؟
سلام
کد چی ؟

ASKaffash
شنبه 27 شهریور 1389, 15:08 عصر
سلام
فرض کنیم Componet را مثلا با منطق ساده ذیل طراحی کرده ایم :

public class MyClass
{
public Fx Fx;
public double Sigma(double a, double b)
{
return (b - a) * (this.Fx(b) - this.Fx(a));
}
}

حال مثلا در یک فرم با دادن تابع Fx می خواهیم مقدار انتگرال (فرضا) حساب کنیم :

public partial class FormDelegate : Form
{
public FormDelegate()
{
InitializeComponent();
MyClass I = new MyClass();
I.Fx += MyFx;
this.Text = I.Sigma(1, 2).ToString();
}
public double MyFx(double x)
{
return Math.Sin(x);
}
}

اَرژنگ
شنبه 27 شهریور 1389, 15:52 عصر
سلام
یک مثال واقعی و محاسباتی از کاربرد Delegate :
فرض کنیم هدف تولید Componet ای است که با روش رانج کوتا قرار است مقدار انتگرال معین هر تابع ریاضی را محاسبه کند در اینجا دریافت تابع Fx می تواند توسط یک Delegate انجام شود و به نظرم راه دیگری متصور نیست
با استفاده از اینترفیس هم میشه.

fjm11100
شنبه 27 شهریور 1389, 16:36 عصر
اینم یک مطلب راجع به اینکه کی باید از delegate به جای اینترفیس استفاده کرد. از خود msdn
When to Use Delegates Instead of Interfaces (C# Programming Guide)

Both delegates and interfaces enable a class designer to separate type declarations and implementation. A given interface can be inherited and implemented by any class or struct. A delegate can be created for a method on any class, as long as the method fits the method signature for the delegate. An interface reference or a delegate can be used by an object that has no knowledge of the class that implements the interface or delegate method. Given these similarities, when should a class designer use a delegate and when should it use an interface?

Use a delegate in the following circumstances:

An eventing design pattern is used.

It is desirable to encapsulate a static method.

The caller has no need to access other properties, methods, or interfaces on the object implementing the method.

Easy composition is desired.

A class may need more than one implementation of the method.

Use an interface in the following circumstances:

There is a group of related methods that may be called.

A class only needs one implementation of the method.

The class using the interface will want to cast that interface to other interface or class types.

The method being implemented is linked to the type or identity of the class: for example, comparison methods.

One good example of using a single-method interface instead of a delegate is IComparable or the generic version, IComparable <T >. IComparable declares the CompareTo method, which returns an integer that specifies a less than, equal to, or greater than relationship between two objects of the same type. IComparable can be used as the basis of a sort algorithm. Although using a delegate comparison method as the basis of a sort algorithm would be valid, it is not ideal. Because the ability to compare belongs to the class and the comparison algorithm does not change at run time, a single-method interface is ideal.

اَرژنگ
شنبه 27 شهریور 1389, 16:55 عصر
اینم یک مطلب راجع به اینکه کی باید از delegate به جای اینترفیس استفاده کرد. از خود msdn


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

ASKaffash
یک شنبه 28 شهریور 1389, 08:18 صبح
سلام
البته یک فرق میکنه در اینترفیس حتما باید متد پیاده سازی گردد ولی در Delegate اگر متد ارائه نشود میتوان از یک پیش فرض استفاده کرد

میلاد قاضی پور
یک شنبه 28 شهریور 1389, 11:36 صبح
در اینصورت از کجا باید بفهمیم که چه موقع باید از دلگیتها استفاده بشه ؟

Saeed_m_Farid
یک شنبه 28 شهریور 1389, 12:18 عصر
اینا رو هم ببینی بد نیست:
آموزش Delegate & Event (http://www.barnamenevis.org/forum/showthread.php?t=204974)
پست های 37 و 38 این صفحه (http://barnamenevis.org/forum/showthread.php?t=223626&page=4)
پست سوم نحوه استفاده از BackgroundWorker برای همزمان سازی ‏ (http://www.barnamenevis.org/forum/showthread.php?t=197197)

اَرژنگ
یک شنبه 28 شهریور 1389, 13:24 عصر
در اینصورت از کجا باید بفهمیم که چه موقع باید از دلگیتها استفاده بشه ؟
http://barnamenevis.org/forum/showpost.php?p=1102079&postcount=24

میلاد قاضی پور
یک شنبه 28 شهریور 1389, 13:43 عصر
http://barnamenevis.org/forum/showpost.php?p=1102079&postcount=24
خب این اینترفیس و دلگیت هست . فقط اینترفیس نیست که میشه باهاش کار دلگیت رو انجام داد . موارد دیگه ای هم هستند .

ASKaffash
یک شنبه 28 شهریور 1389, 15:45 عصر
در اینصورت از کجا باید بفهمیم که چه موقع باید از دلگیتها استفاده بشه ؟

سلام
واقعا تشخیص سخت است شاید هم سلیقه ای ! نمی دونم ؟

hadiroosta
چهارشنبه 11 آذر 1394, 04:53 صبح
بالاخره کسی تونست بعد از سالها این مفهوم رو بفهمه و برای دیگران توضیح بده !!!!؟؟؟؟؟