Compartilhar via


CA1003: usar instâncias do manipulador de eventos genéricos

TypeName

UseGenericEventHandlerInstances

CheckId

CA1003

Categoria

Microsoft.Design

Alteração Significativa

Quebra

Causa

Um tipo contém um representante que retorna anulem, cuja assinatura contém dois parâmetros (os primeiros um objeto e o segundo um tipo que é assinalável a EventArgs), e o assembly que contém .NET Framework 2,0de destino.

Descrição da Regra

Antes de .NET Framework 2,0, para transmitir as informações personalizadas ao manipulador de eventos, um novo delegado precisou ser declarado especificada uma classe que é derivada da classe de EventArgs .Isso não é mais válido em .NET Framework 2,0, que introduziram o representante de EventHandler .Este delegado genérico permite qualquer classe que é derivada de EventArgs a ser usado junto com o manipulador de eventos.

Como Corrigir Violações

Para corrigir uma violação desta regra, remova o delegado e substituir seu uso usando o representante de EventHandler .Se a delegação é gerado automaticamente pelo compilador de Visual Basic , altere a sintaxe de declaração de evento para usar o representante de EventHandler .

Quando Suprimir Alertas

Não elimine um alerta desta regra.

Exemplo

O exemplo a seguir mostra um representante que viola a regra.No exemplo de Visual Basic , os comentários a seguir descrevem como modificar o exemplo para atender a regra.Para o exemplo do C#, 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 delegado do exemplo anterior, que obedece à regra, seu uso e substituir os métodos de ClassThatRaisesEvent e de ClassThatHandlesEvent usando o representante de 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();
      }
   }
}

Regras Relacionadas

CA1005: evitar parâmetros excessivos em tipos genéricos

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

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

CA1002: não expor listas genéricas

CA1006: não aninhar tipos genéricos em assinaturas de membro

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

CA1007: usar genéricos quando apropriado

Consulte também

Referência

Genéricos (Guia de Programação em C#)