مشاركة عبر


ca1003: استخدام مثيلات معالج حدث العام

TypeName

UseGenericEventHandlerInstances

CheckId

ca1003

Category

Microsoft.تصميم

تعطيل تغيير

فصل

السبب

يحتوي على نوع تفويض إرجاع فارغ (Void)، ويتضمن توقيع الخاصة به معلمتين (الكائن أول والثاني النوع الذي هو قابل للتعيين إلى EventArgs)، وتجميع الذي يحتوي تستهدف .NET Framework 2.0.

وصف القاعدة

قبل .NET Framework 2.0، لتمرير المعلومات المخصصة إلى معالج الأحداث، جديد تفويض اضطر إلى أن يتم تعريف الذي حددته فئة مشتقة من System.EventArgsclass. Th هو هو لم يعد صحيحاً في .NET Framework 2.0، أي تقديم System.EventHandler<TEventArgs>المفوض. يسمح هذا تفويض عام لأي فئة مشتقة من EventArgsإلى لاستخدامه مع معالج حدث.

كيف إلى الإصلاح انتهاكات

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

عند إلى منع التحذيرات

لا بمنع تحذير من هذه قاعدة.

مثال

يوضح المثال التالي تفويض التي تخالف قاعدة. في المثال Visual أساسى، تعليقات تصف كيفية إلى تعديل المثال إلى تفي بقاعدة. مثلاً C#، يتبع مثال يوضح التعليمة البرمجية المعدلة.

Imports System

Namespace DesignLibrary

   Public Class CustomEventArgs
      Inherits EventArgs

      Public info As String = "data"

   End Class

   Public Class ClassThatRaisesEvent

      ' This statement creates a new delegate, which violates the rule.
      Event SomeEvent(sender As Object, e As CustomEventArgs)

      ' To satisfy the rule, comment out the previous line 
      ' and uncomment the following line.
      'Event SomeEvent As EventHandler(Of CustomEventArgs)

      Protected Overridable Sub OnSomeEvent(e As CustomEventArgs)
            RaiseEvent SomeEvent(Me, e)
      End Sub

      Sub SimulateEvent()
         OnSomeEvent(New CustomEventArgs())
      End Sub

   End Class

   Public Class ClassThatHandlesEvent

      Sub New(eventRaiser As ClassThatRaisesEvent)
         AddHandler eventRaiser.SomeEvent, AddressOf HandleEvent
      End Sub

      Private Sub HandleEvent(sender As Object, e As CustomEventArgs)
         Console.WriteLine("Event handled: {0}", e.info)
      End Sub

   End Class

   Class Test

      Shared Sub Main()

         Dim eventRaiser As New ClassThatRaisesEvent()
         Dim eventHandler As New ClassThatHandlesEvent(eventRaiser)

         eventRaiser.SimulateEvent()

      End Sub

   End Class

End Namespace
using System;

namespace DesignLibrary
{
   // This delegate violates the rule.
   public delegate void CustomEventHandler(
      object sender, CustomEventArgs e);

   public class CustomEventArgs : EventArgs
   {
      public string info = "data";
   }

   public class ClassThatRaisesEvent
   {
      public event CustomEventHandler SomeEvent;

      protected virtual void OnSomeEvent(CustomEventArgs e)
      {
         if(SomeEvent != null)
         {
            SomeEvent(this, e);
         }
      }

      public void SimulateEvent()
      {
         OnSomeEvent(new CustomEventArgs());
      }
   }

   public class ClassThatHandlesEvent
   {
      public ClassThatHandlesEvent(ClassThatRaisesEvent eventRaiser)
      {
         eventRaiser.SomeEvent += 
            new CustomEventHandler(HandleEvent);
      }

      private void HandleEvent(object sender, CustomEventArgs e)
      {
         Console.WriteLine("Event handled: {0}", e.info);
      }
   }

   class Test
   {
      static void Main()
      {
         ClassThatRaisesEvent eventRaiser = new ClassThatRaisesEvent();
         ClassThatHandlesEvent eventHandler = 
            new ClassThatHandlesEvent(eventRaiser);

         eventRaiser.SimulateEvent();
      }
   }
}

المثال التالي بإزالة التعريف المفوض من المثال السابق، الذي يفي بالقاعدة، ويحل محل به استخدم في ClassThatRaisesEventو ClassThatHandlesEventوظائف مع System.EventHandler<TEventArgs>المفوض.

using System;

namespace DesignLibrary
{
   public class CustomEventArgs : EventArgs
   {
      public string info = "data";
   }

   public class ClassThatRaisesEvent
   {
      public event EventHandler<CustomEventArgs> SomeEvent;

      protected virtual void OnSomeEvent(CustomEventArgs e)
      {
         if(SomeEvent != null)
         {
            SomeEvent(this, e);
         }
      }

      public void SimulateEvent()
      {
         OnSomeEvent(new CustomEventArgs());
      }
   }

   public class ClassThatHandlesEvent
   {
      public ClassThatHandlesEvent(ClassThatRaisesEvent eventRaiser)
      {
         eventRaiser.SomeEvent += 
            new EventHandler<CustomEventArgs>(HandleEvent);
      }

      private void HandleEvent(object sender, CustomEventArgs e)
      {
         Console.WriteLine("Event handled: {0}", e.info);
      }
   }

   class Test
   {
      static void Main()
      {
         ClassThatRaisesEvent eventRaiser = new ClassThatRaisesEvent();
         ClassThatHandlesEvent eventHandler = 
            new ClassThatHandlesEvent(eventRaiser);

         eventRaiser.SimulateEvent();
      }
   }
}

القواعد ذات الصلة

ca1005: تجنب الإفراط معلمات تشغيل الأنواع العامة

ca1303: لا تمرير القيم الحرفية كمترجم معلمات

ca1000: لا بتعريف الأعضاء ثابتة تشغيل الأنواع العامة

ca1002: لا تعرض القوائم العامة

CA1006: Do not nest generic types in member signatures

ca1004: يجب توفير وظائف عامة معلمة نوع

CA1007: Use generics where appropriate

راجع أيضًا:

المرجع

generics (C# البرمجة الدليل)