다음을 통해 공유


제네릭 이벤트 처리기 인스턴스를 사용하십시오.

업데이트: 2007년 11월

TypeName

UseGenericEventHandlerInstances

CheckId

CA1003

범주

Microsoft.Design

변경 수준

주요 변경

원인

void를 반환하며 해당 시그니처에 두 개의 매개 변수(첫 번째는 개체, 두 번째는 EventArgs에 할당될 수 있는 형식)를 포함하는 대리자가 형식에 포함되어 있으며, 포함 어셈블리가 .NET Framework 2.0를 대상으로 합니다.

규칙 설명

.NET Framework 2.0 이전에는 사용자 지정 정보를 이벤트 처리기에 전달하려면 System.EventArgs 클래스에서 파생된 클래스를 지정하는 새로운 대리자를 선언해야 했습니다. 그러나 .NET Framework 2.0에서는 System.EventHandler<TEventArgs> 대리자가 도입되었으므로 새로운 대리자를 선언하지 않아도 됩니다. 이 제네릭 대리자를 사용하면 EventArgs에서 파생된 모든 클래스를 이벤트 처리기에 사용할 수 있습니다.

위반 문제를 해결하는 방법

이 규칙 위반 문제를 해결하려면 대리자를 제거하고 System.EventHandler<TEventArgs> 대리자를 대신 사용합니다. Visual Basic 컴파일러에 의해 대리자가 자동으로 생성되는 경우 System.EventHandler<TEventArgs> 대리자를 사용하도록 이벤트 선언의 구문을 변경합니다.

경고를 표시하지 않는 경우

이 규칙에서는 경고를 표시해야 합니다.

예제

다음 예제에서는 규칙을 위반하는 대리자를 보여 줍니다. Visual Basic 예제의 경우 규칙을 충족하기 위해 예제를 수정하는 방법이 주석에 설명되어 있습니다. 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();
      }
   }
}

관련 규칙

제네릭 형식에 매개 변수를 너무 많이 사용하지 마십시오.

컬렉션은 제네릭 인터페이스를 구현해야 합니다.

정적 멤버를 제네릭 형식으로 선언하지 마십시오.

제네릭 목록을 노출하지 마십시오.

멤버 시그니처에 제네릭 형식을 중첩하지 마십시오.

제네릭 메서드는 형식 매개 변수를 제공해야 합니다.

적합한 제네릭을 사용하십시오.

참고 항목

참조

제네릭(C# 프로그래밍 가이드)