Sdílet prostřednictvím


CA1003: Použijte instance obecných obslužných rutin události

TypeName

UseGenericEventHandlerInstances

CheckId

CA1003

Kategorie

Microsoft.Design

Narušující změna

Narušující

Příčina

Typ obsahuje delegát vracející hodnotu void, jehož předpis obsahuje dva parametry (první je objekt a druhý typ přiřaditelný do typu EventArgs), přičemž je příslušné sestavení zacíleno na rozhraní .NET Framework 2,0.

Popis pravidla

Ve verzích starších než .NET Framework 2,0 bylo k předání vlastní informace obslužné rutině událostí zapotřebí deklarovat nový delegát, který určoval třídu odvozenou z třídy EventArgs.To již neplatí v rozhraní .NET Framework 2,0, protože rozhraní zavádí delegát EventHandler.Tento obecný delegát umožňuje s obslužnou rutinou událostí použit libovolnou třídu odvozenou ze třídy EventArgs.

Jak vyřešit porušení

Chcete-li opravit porušení tohoto pravidla, odstraňte delegát a nahraďte jeho použití pomocí EventHandler.Je-li delegát automaticky generován kompilátorem Visual Basic, změně syntaxi deklarace události tak, aby používala delegát EventHandler.

Kdy potlačit upozornění

Nepotlačujte upozornění na toto pravidlo.

Příklad

Následující příklad ukazuje delegát, který porušuje toto pravidlo.V příkladu v jazyce Visual Basic komentáře popisují způsob úpravy příkladu tak, aby splňoval pravidlo.V případě příkladu v jazyce C# následuje příklad, který ukazuje upravený kód.

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();
      }
   }
}

Následující příklad odstraňuje deklaraci delegátu z předchozího příkladu, což splňuje pravidlo, a nahrazuje jeho použití v metodách ClassThatRaisesEvent a ClassThatHandlesEvent pomocí delegátu EventHandler.

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();
      }
   }
}

Související pravidla

CA1005: Vyhněte se nadbytečným parametrům na obecných typech

CA1010: Kolekce musí implementovat obecné rozhraní

CA1000: Nedeklarujte statické členy v obecných typech

CA1002: Nezveřejňujte obecné seznamy

CA1006: Nevnořujte obecné typy v signaturách členu

CA1004: Obecné metody by měly poskytnout parametr typu

CA1007: Použijte obecné typy, kde je to vhodné

Viz také

Referenční dokumentace

Obecné typy (Průvodce programováním v C#)