PDA

View Full Version : تعریف یک رویداد برای شی



aghayex
یک شنبه 30 بهمن 1390, 23:50 عصر
با سلام
من یه برنامه سورس باز دستم افتاده که تو چند موردش به مشکل برخوردم که اگه دوستی می تونه منو راهنمایی کنه ممنون میشم . مطلب اول اینه که سرچی که من انجام دادم در مورد تعریف یک رویداد و انتصاب اون به یک شی به صورت زیر بوده :


public delegate void NewClick(object sender, MouseEventArgs mevent);
public event NewClick LeftClick;
protected override void OnMouseDown(MouseEventArgs mevent)
{
if (mevent.Button ==MouseButtons.Left )
}
if (this.RightClick !=null)
this.RightClick(this, mevent);
}
{


تا اینجا تقریبا درسته اما تو برنامه ی سورس باز من اینطوری تعریف شده


public class ContentChangedEventArgs : EventArgs
{
private Person newPerson;

public Person NewPerson
{
get { return newPerson; }
}

public ContentChangedEventArgs(Person newPerson)
{
this.newPerson = newPerson;
}
}


public event EventHandler<ContentChangedEventArgs> ContentChanged;
public void OnContentChanged(Person newPerson)
{
dirty = true;
if (ContentChanged != null)
ContentChanged(this, new ContentChangedEventArgs(newPerson));
}


حالا سوال من اینه که این نحوه تعریف رویداد چطوریه :

public event EventHandler<ContentChangedEventArgs> ContentChanged;

جای delegate کجای این قضیست

gwbasic
دوشنبه 01 اسفند 1390, 08:56 صبح
EventHandler ژنریک در NET. نگارش 2 اضافه شده و یک delegate ژنریک می باشد. اگر به تعریف آن توجه کنید موضوع روشن می شود:

public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);


دو خط بالایی کدتون دقیقا معادل خط آخر کدتون هست. در حقیقت با استفاده از EventHandler ژنریک نیاز به تعریف delegate جداگانه وجود ندارد و در یک خط event تعریف می شود

aghayex
دوشنبه 01 اسفند 1390, 20:14 عصر
دستتون درد نکنه اما جوابتون خیلی سطحی بود در صورتی که تا حالا من با هیچ کدوم از این امکانات کار نکردم و درک خوبی ازشون ندارم و فقط تحقیق مفصلی در مورد delegate داشتم .
مثلا چه فرقی بین تعریف اول و دوم هست و هر کدوم در کجا استفاده میشن
و اینکه این کلاس از چه نوعیست
public class ContentChangedEventArgs : EventArgs
و در مورد این خط من هیچی نفهمیدم ContentChanged(this, new ContentChangedEventArgs(newPerson)); و فقط فهمیدم که رویداد رو فراخوانی کرده و دو پارامتر داده یکی کلاس و دومی هم کلاس اول حالا چرا اینکار رو کرده نمی دونم

gwbasic
دوشنبه 01 اسفند 1390, 22:08 عصر
شما در مورد دو حالت تعریف event‌سوال کردید که توضیح دادم (این دو مورد هیچ فرقی نمی کنند)
چند مورد رو اشاره می کنم امیدوارم جوابتون رو بگیرید
1- event مانند property از اعضای یک کلاس هست بنابراین "انتصاب اون به یک شی" بی معنی است.
2- event در اصل یک delegate هست با سطح دسترسی محدود تر!!!
بعد از مرحله تعریف event مرحله دوم rasied‌کردن اون هست. متدی رو که OnContentChanged نام دارد و کدی رو که در پست دوم گذاشتید کار raised‌کردن event رو انجام می ده. دقیقا مثل Invoke کردن متدهای یک delegate

برای آشنایی بیشتر با Delegate‌به آموزش delegate‌من مراجعه کنید و برای تعریف event‌هم فکر می کنم داخل سایت آموزش باشد.