سؤال

لنفترض أن لدي فئة تسمى Frog، فهي تبدو كما يلي:

public class Frog
{
     public int Location { get; set; }
     public int JumpCount { get; set; }


     public void OnJump()
     {
         JumpCount++;
     }

}

أحتاج إلى المساعدة في شيئين:

  1. أريد إنشاء حدث باسم Jump في تعريف الفصل.
  2. أريد إنشاء مثيل لفئة الضفدع، ثم إنشاء طريقة أخرى سيتم استدعاؤها عندما يقفز الضفدع.
هل كانت مفيدة؟

المحلول

public event EventHandler Jump;
public void OnJump()
{
    EventHandler handler = Jump;
    if (null != handler) handler(this, EventArgs.Empty);
}

ثم

Frog frog = new Frog();
frog.Jump += new EventHandler(yourMethod);

private void yourMethod(object s, EventArgs e)
{
     Console.WriteLine("Frog has Jumped!");
}

نصائح أخرى

@CQ:لماذا تقوم بإنشاء نسخة محلية من الجبهة الوطنية Jump؟بالإضافة إلى ذلك، يمكنك حفظ الاختبار التالي عن طريق تغيير إعلان الحدث قليلاً:

public event EventHandler Jump = delegate { };

public void OnJump()
{
    Jump(this, EventArgs.Empty);
}

فيما يلي نموذج لكيفية استخدام EventHandler عادي أو مفوض مخصص.لاحظ أن ?. يستخدم بدلا من . للتأكد من أنه إذا كان الحدث فارغًا، فسوف يفشل بشكل نظيف (إرجاع فارغ)

public delegate void MyAwesomeEventHandler(int rawr);
public event MyAwesomeEventHandler AwesomeJump;

public event EventHandler Jump;

public void OnJump()
{
    AwesomeJump?.Invoke(42);
    Jump?.Invoke(this, EventArgs.Empty);
}

لاحظ أن الحدث نفسه يكون فارغًا فقط في حالة عدم وجود مشتركين، وبمجرد استدعائه، يصبح الحدث آمنًا.لذلك يمكنك أيضًا تعيين معالج فارغ افتراضي للتأكد من أن الحدث ليس فارغًا.لاحظ أن هذا من الناحية الفنية معرض للخطر بسبب قيام شخص آخر بمسح جميع الأحداث (باستخدام GetInvocationList)، لذا استخدمه بحذر.

public event EventHandler Jump = delegate { };

public void OnJump()
{
    Jump(this, EventArgs.Empty);
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top