Udostępnij za pośrednictwem


CA1003: Użyj wystąpień programu obsługi zdarzeń rodzajowy

TypeName

UseGenericEventHandlerInstances

CheckId

CA1003

Kategoria

Microsoft.Design

Zmiana kluczowa

Kluczowa

Przyczyna

Typ zawiera pełnomocnika zwracającego wartość typu void, którego podpis zawiera dwa parametry (pierwszy typu obiekt i drugi typu, który można przypisać do EventArgs) i zawierający zestaw odwołujący się do .NET Framework 2.0.

Opis reguły

Przed .NET Framework 2.0, aby przekazać informacje niestandardowe do obsługi zdarzeń, należało zadeklarować nowego pełnomocnika, który określał klasę dziedziczącą po klasie System.EventArgs.Od .NET Framework 2.0, który wprowadził delegat System.EventHandler<TEventArgs> to już nie jest prawdą.Delegat generyczny pozwala używać razem z obsługą zdarzeń dowolnej klasy pochodzącej od EventArgs.

Jak naprawić naruszenia

Aby naprawić naruszenie tej reguły, należy usunąć delegata i zastąpić jego wykorzystanie używając delegata System.EventHandler<TEventArgs>.Jeżeli delegat jest generowany automatycznie przez kompilator Visual Basic, należy zmienić składnię deklaracji zdarzenia, aby używała delegata System.EventHandler<TEventArgs>.

Kiedy pominąć ostrzeżenia

Nie należy pomijać ostrzeżenia dotyczącego tej reguły.

Przykład

Poniższy przykład pokazuje delegata, który narusza regułę.W przykładzie Visual Basic komentarze opisują sposób zmodyfikować przykład, aby spełnić regułę.Dla przykładu w języku C# poniższy przykład przedstawia zmodyfikowany kod.

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

W następującym przykładzie usunięto deklarację delegata z poprzedniego przykładu, który spełnia regułę i zastąpiono jego użycie w metodach ClassThatRaisesEvent i ClassThatHandlesEvent delegatem 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();
      }
   }
}

Powiązane reguły

CA1005: Uniknąć nadmiernego parametrów na typy rodzajowe

CA1010: Kolekcji należy implementować interfejs rodzajowy

CA1000: Elementy statyczne nie są deklarowane w typach podstawowych

CA1002: Nie będą uwidaczniać rodzajowy list

CA1006: Nie zagnieżdżaj typy rodzajowe w Członkowskim podpisów

CA1004: Metody rodzajowe powinny dostarczyć parametr typu

CA1007: Użyj generyczne, gdzie stosowne

Zobacz też

Informacje

Generyczne (Podręcznik programowania C#)