CA1003: Usar instâncias do manipulador de evento genérico

TypeName

UseGenericEventHandlerInstances

CheckId

CA1003

<strong>Categoria</strong>

Microsoft.design

Alteração significativa

Quebrando

Causa

Um tipo contém um delegado que retorna void, cuja assinatura contém dois parâmetros (o primeiro um objeto e o segundo um tipo que pode ser atribuído a EventArgs) e os destinos de assembly contendo .NET Framework 2.0.

Descrição da regra

Antes de .NET Framework 2.0, para passar informações personalizadas para o manipulador de eventos, um novo delegado precisava ser declarado que especificado de uma classe que é derivada da System.EventArgs classe. Isso não é verdade em .NET Framework 2.0, que introduziu o System.EventHandler<TEventArgs> delegate. Este representante genérico permite que qualquer classe que é derivada de EventArgs para ser usado junto com o manipulador de eventos.

Como corrigir violações

Para corrigir uma violação desta regra, o delegado de remover e substituir seu uso, usando o System.EventHandler<TEventArgs> delegate. Se o delegado é gerado automaticamente pelo Visual Basic compilador, alterar a sintaxe de declaração de evento para usar o System.EventHandler<TEventArgs> delegate.

Quando suprimir avisos

Não suprimir um aviso da regra.

Exemplo

O exemplo a seguir mostra um delegado que viola a regra. No Visual Basic exemplo, comentários que descrevem como modificar o exemplo para satisfazer a regra. C# exemplo, segue um exemplo que mostra o código modificado.

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

O exemplo a seguir remove a declaração do delegado do exemplo anterior, que satisfaz a regra e, em seguida, substitui o seu uso na ClassThatRaisesEvent e ClassThatHandlesEvent métodos usando a System.EventHandler<TEventArgs> delegate.

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

Regras relacionadas

CA1005: Evitar o excesso parâmetros em tipos genéricos

CA1010: Coleções devem implementar a interface genérica

CA1000: Não é declarar membros estáticos em tipos genéricos

CA1002: Não expõem listas genéricas

CA1006: Não se aninham tipos genéricos em assinaturas de membro

CA1004: Métodos genéricos devem fornecer o parâmetro de tipo

CA1007: Use genéricos onde for apropriado

Consulte também

Referência

Generics (C# Programming Guide)