استدعاء الأساليب الأساسية عند تجاوز أحداث مستوى الصفحة

StackOverflow https://stackoverflow.com/questions/19294

  •  09-06-2019
  •  | 
  •  

سؤال

في الكود الخاص بي، أقوم بتوصيل الأحداث الخاصة بي على النحو التالي:

protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    btnUpdateUser.Click += btnUpateUserClick;
}

لقد فعلت ذلك بهذه الطريقة لأن هذا ما رأيته في الأمثلة.

  • هل يلزم استدعاء الأسلوب base.OnInit()؟
  • فهل سيتم استدعاؤه ضمنا؟
  • هل الأفضل تسميتها في بداية الطريقة أم في نهايتها؟
  • ما هو المثال الذي يمكن أن يؤدي فيه الارتباك حول الطريقة الأساسية إلى وقوعك في مشكلة؟
هل كانت مفيدة؟

المحلول

ينبغي أن أوضح:

توصي الإرشادات بأن إطلاق الحدث يجب أن يتضمن استدعاء "تشغيل".اسم الحدث"، لكنهم يقولون أيضًا أنه إذا تجاوزت فئة مشتقة تلك الطريقة ونسيت استدعاء الطريقة الأساسية، فلا يزال من المفترض أن يتم إطلاق الحدث.

راجع "ملاحظة مهمة" في منتصف الطريق تقريبًا هذه الصفحة:

ليست هناك حاجة للفئات المشتقة التي تتجاوز الطريقة الافتراضية المحمية لاستدعاء تطبيق الفئة الأساسية.يجب أن تستمر الفئة الأساسية في العمل بشكل صحيح حتى إذا لم يتم استدعاء تنفيذها.

نصائح أخرى

في هذه الحالة، إذا لم تقم باستدعاء قاعدة OnInit الأساسية، فلن يتم تشغيل Init حتى.

بشكل عام، من الأفضل دائمًا استدعاء الأسلوب الأساسي، إلا إذا كنت تعرف على وجه التحديد أنك لا تريد حدوث السلوك الأساسي.

يعتمد ما إذا كان يتم استدعاؤه في البداية أو النهاية على الطريقة التي تريد أن تعمل بها الأشياء.في مثل هذه الحالة، حيث تستخدم التجاوز بدلاً من ربط معالج الأحداث، فإن استدعائه في بداية الطريقة يكون أكثر منطقية.بهذه الطريقة، سيتم تشغيل التعليمات البرمجية الخاصة بك بعد أي معالجات، مما يجعلها تحاكي معالج الأحداث "العادي" بشكل أكبر.

على الرغم من أن إرشادات تصميم إطار العمل الرسمية توصي بخلاف ذلك، إلا أن معظم مصممي الفئات سيجعلون طريقة OnXxx() مسؤولة عن إطلاق الحدث الفعلي، مثل هذا:

protected virtual void OnClick(EventArgs e)
{
    if (Click != null) Click(this, e);
}

...لذا، إذا ورثت من الفصل ولم تستدعي base.OnClick(e)، فلن يتم إطلاق حدث Click أبدًا.

لذا نعم، على الرغم من هذا لا ينبغي إذا كان الأمر كذلك وفقًا لإرشادات التصميم الرسمية، أعتقد أنه من المفيد الاتصال بـ base.OnInit(e) فقط للتأكد.

توصي إرشادات تصميم الإطار الرسمي بخلاف ذلك

إنهم يفعلون؟أشعر بالفضول، لقد اعتقدت دائمًا العكس، وقراءة إرشادات تصميم الإطار وتشغيل FxCop عززت وجهة نظري فقط.كان لدي انطباع بأنه يجب دائمًا إطلاق الأحداث من طرق OnXxx() الافتراضية، والتي تأخذ معلمة EventArgs

من الأفضل أن تفعل ذلك بهذه الطريقة، ثم ينتهي هذا النقاش.رغم ذلك، فإن المقالة مثيرة للاهتمام، لا سيما بالنظر إلى أن .NET Framework لا يحترم هذه الإرشادات.

@Ch00k وScott لا أعلم - أنا أحب Onاسم الحدث نمط نفسي.ونعم، أنا أحد الأشخاص المذنبين بإطلاق الحدث بهذه الطريقة.

أعتقد أن تجاوز طريقة On* واستدعاء الطريقة الأساسية هو الحل الأمثل.التعامل مع الأحداث الخاصة بك يبدو خاطئًا إلى حد ما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top