كيف يكون الخطأ هو إنشاء مندوب معالج الأحداث مع توقيع المعيار (OBJ Sender، EventArgs Args)؟

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

  •  18-09-2019
  •  | 
  •  

سؤال

أفهم فوائد استخدام توقيع مفوض معالج MS معيار MS Signler لأنه يتيح لك التوسع بسهولة في المعلومات التي تم تمريرها من خلال الحدث مع كسر أي علاقات قديمة تستند إلى توقيع المندوب القديم.

ما أتساءله هو في الممارسة العملية كم مرة يتبع الناس هذه القاعدة؟ قل لدي حدث بسيط مثل هذا

public event NameChangedHandler NameChanged;
public delegate void NameChangedHandler(Object sender, string oldName, string newName);

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

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

المحلول

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

لذلك سوف تجعلك صفقة. إذا وعدت بذلك بالطريقة الصحيحة، فسوف أقدم لك مقتطفا كود سيجعله أقل من الألم. فقط ضع هذا في ملف .snippet، ووضع هذا الملف في:

مستنداتي Visual Studio 2008 Code Sleappets Visual C # My Code Sleappets
(أو Visual Studio 2005 إن وجد)

وهنا القصاص. استخدمه في VS عن طريق كتابة علامة التبويب EV2Generic وضربها:

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <Title>Generic event with two types/arguments.</Title>
      <Shortcut>ev2Generic</Shortcut>
      <Description>Code snippet for event handler and On method</Description>
      <Author>Kyralessa</Author>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
    </Header>
    <Snippet>
      <Declarations>
        <Literal>
          <ID>type1</ID>
          <ToolTip>Type of the first property in the EventArgs subclass.</ToolTip>
          <Default>propertyType1</Default>
        </Literal>
        <Literal>
          <ID>arg1Name</ID>
          <ToolTip>Name of the first argument in the EventArgs subclass constructor.</ToolTip>
          <Default>property1Name</Default>
        </Literal>
        <Literal>
          <ID>property1Name</ID>
          <ToolTip>Name of the first property in the EventArgs subclass.</ToolTip>
          <Default>Property1Name</Default>
        </Literal>
        <Literal>
          <ID>type2</ID>
          <ToolTip>Type of the second property in the EventArgs subclass.</ToolTip>
          <Default>propertyType2</Default>
        </Literal>
        <Literal>
          <ID>arg2Name</ID>
          <ToolTip>Name of the second argument in the EventArgs subclass constructor.</ToolTip>
          <Default>property2Name</Default>
        </Literal>
        <Literal>
          <ID>property2Name</ID>
          <ToolTip>Name of the second property in the EventArgs subclass.</ToolTip>
          <Default>Property2Name</Default>
        </Literal>
        <Literal>
          <ID>eventName</ID>
          <ToolTip>Name of the event</ToolTip>
          <Default>NameOfEvent</Default>
        </Literal>
      </Declarations>
      <Code Language="CSharp">
        <![CDATA[public class $eventName$EventArgs : System.EventArgs
      {
        public $eventName$EventArgs($type1$ $arg1Name$, $type2$ $arg2Name$)
        {
          this.$property1Name$ = $arg1Name$;
          this.$property2Name$ = $arg2Name$;
        }

        public $type1$ $property1Name$ { get; private set; }
        public $type2$ $property2Name$ { get; private set; }
      }

      public event EventHandler<$eventName$EventArgs> $eventName$;
            protected virtual void On$eventName$($eventName$EventArgs e)
            {
                var handler = $eventName$;
                if (handler != null)
                    handler(this, e);
            }]]>
      </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

نصائح أخرى

استخدم ال EventHandler<T> المندوبين العامين لأحداثك وإنشاء نوع مشتق من EventArgs لعقد بيانات الحدث الخاص بك. بمعنى آخر، دائما. إنه شيء تعرفه دائما كيف يعمل بالضبط عند صادفه لأنه لم يتم ذلك أبدا.

يحرر:

تحليل الكود CA1003: استخدام مثيلات معالج الأحداث العامة
تحليل الكود CA1009: إعلان معالجات الأحداث بشكل صحيح

في الممارسة العملية، عدد المرات التي لا تستخدم فيها الأشخاص الفصول الدراسية المشتقة.

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

هل يستحق كل هذا العناء لإنشاء فئة منفصلة namechangeDeventargs، أو لأحداث بسيطة مثل هذا من المقبول أن تعيد الحجج مباشرة من خلال حجج المفوض؟

يبدو أنك تقول أنك ستستخدم EventArgs لمعالجات الأحداث بمزيد من المعالم وعدم استخدامها للحصول على مثيلات مثل هذا. بصراحة، هذا ببساطة ليس خيارا عند البرمجة في C #. الاتساق أمر ضروري، خاصة في عالم المنتدى اليوم مثل هذا، مشاريع مفتوحة المصدر، إلخ حيث يسهل فقده. بالتأكيد إذا كنت تقوم برمجة هذا تحت صخرة، فقد تفعل ما تريد، لكن المجتمع C # أكبر ستشكرك على المعايير التالية وخاصة استخدام الاتساق في رمزك.

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