سؤال

هل يمكن لأي شخص أن يشرح معنى الجزء التالي من الكود:

private event UserChangedHandler m_UserChanged;
public event UserChangedHandler UserChanged
{
  add
  {
      if (m_UserChanged != value)
      {
        m_UserChanged += value;
      }
  }
}

شكرًا

هل كانت مفيدة؟

المحلول

add { } هو بناء يشبه كثيرا get { } للخصائص ، باستثناء إضافة أعمال على الأحداث. أنت تحدد الوظائف المخصصة هنا عند إضافة مندوبين إلى حدث ما.

في هذه الحالة ، يمنع الجسم هذه الطريقة على التوالي التكرارات (أي لا يمكنك تسجيل نفس الطريقة/المعالج مرتين في صف واحد).

لذلك في هذا المثال:

public void HandlerUserChanged(object o, UserChangedEventArgs args)
{
     // some code
}

public void HandlerUserChanged2(object o, UserChangedEventArgs args)
{
     // some code
}

لاحقاً:

UserChanged += HandleUserChanged;
UserChanged += HandleUserChanged;
UserChanged(this, new UserChangedEventArgs());

طريقة HandleUserChanged سوف تطلق النار مرة واحدة فقط ، على الرغم من أنك قمت بتسجيلها مرتين. حدث عادي (بدون add { }) سوف تستدعي الوظيفة مرتين.

لكن:

UserChanged += HandleUserChanged;
UserChanged += HandleUserChanged2;
UserChanged += HandleUserChanged;
UserChanged(this, new UserChangedEventArgs());

سيسمح HandleUserChanged لإطلاق النار مرتين ، لأن المعالج المسجل الأخير ليس على الإطلاق هو الذي يتم إضافته. يعمل المشغل == على الأحداث على المعالج الأخير. (شكرا لماثيو لجذب ذلك إلى الانتباه)

نصائح أخرى

إنه لأمر غريب أن يتم الإعلان عن M_USERCHANGED كحدث بدلاً من مجرد حالة مندوب (هو أن المصطلحات الصحيحة ... أشعر بالارتباك مع المندوبين). تشبه الأحداث نموذج خاصية بسيطة من حيث أنها تلتف بشكل أساسي الحقول الكامنة داخل زوج من الطرق الشفافة.

بالطريقة التي أفهمها ، يسمح .NET بإنشاء حدث وخصائص Infercit (مجهول؟) عن طريق أخذ شيء كهذا:

public int Value { get; set;}
public event EventHandler ValueChanged;

ثم إنشاء الكائنات النائبة الأساسية ذات الصلة لإنشاء شيء مثل هذا:

private int _Value;
public int Value { get { return _Value;} set { _Value = value;}}

private EventHandler _ValueChanged;
public event EventHandler ValueChange { add { _ValueChanged += value;} remove { _ValueChanged -= value;}}

يمكن تعريف الكائن الأساسي بشكل صريح بالطبع ، ولكن ما يبدو عليه عينة الكود أعلاه هو بعض الخلط بين إعلان الأحداث الصريح والضمني ... يبدو أن ما يلي يتم فعله بالفعل (خلف الكواليس ، كما كان ):

private UserChangedHandler _m_UserChanged; 
private event UserChangedHandler m_UserChanged { add { _m_UserChanged += value;} remove { _m_UserChanged -= value;}}
public event UserChangedHandler UserChanged 
{ 
  add 
  { 
      if (m_UserChanged != value) 
      { 
        m_UserChanged += value; 
      } 
  } 
} 

لا يهم حقًا في المخطط الكبير للأشياء ، لا أظن ، لكن يبدو أنه مراقبة.

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