Aracılığıyla paylaş


CA1003: Genel olay işleyici örnekleri kullan

TürAdı

UseGenericEventHandlerInstances

CheckId

CA1003

Kategori

Microsoft.Design

Bozan Değişiklik

Bozan

Sebep

Bir tür, imzası iki parametre (birincisi bir nesne ve ikincisi EventArgs'a imza atabilen bir tür) içeren boşluk döndüren bir temsilci içerir ve içeren derlemeler .NET Framework 2,0 'i hedefler.

Kural Tanımı

Bu .NET Framework 2,0 'den önce, olay işleyicisine özel bir bilgi iletmek için, yeni bir temsilci EventArgs sınıfı tarafından türetilmiş bir sınıf bildirilmesi gerekirdi.Bu artık EventHandler temsilcisini tanıtan .NET Framework 2,0 'da geçerli değildir.Bu genel temsilci EventArgs tarafından türetilmiş olay işleyicisi ile birlikte kullanılması için herhangi bir sınıfa izin verir.

İhlallerin Düzeltilmesi

Bu kuralın bir hlalini düzeltmek için temsilciyi kaldırın ve kullanımını EventHandler temsilcisi kullanarak değiştirin.Temsilci Visual Basic derleyicisi tarafından otomatik olarak oluşturulmuş ise, olay bildirimi sözdizimini EventHandler temsilcisi kullanmak için değiştirin.

Uyarılar Ne Zaman Bastırılmalı

Bu kuraldan bir uyarı gizlemeyin.

Örnek

Aşağıdaki örnek kural ihlaline neden olan bir temsilciyi gösterir.Bu Visual Basic örnekte, yorumlar kuralı karşılamak için örneğin nasıl değiştirileceğini açıklar.C# örnek için, değiştirilmiş kodunu gösteren bir örnek aşağıdadır.

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

Aşağıdaki örnek, kuralın karşılayan önceki örnekten gelen temsilci bildirimini kaldırır ve ClassThatRaisesEvent ve ClassThatHandlesEvent yöntemlerinde EventHandler temsilcisini kullanarak onun kullanımını değiştirir.

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

İlgili Kurallar

CA1005: Genel türlerde aşırı parametrelerden kaçının

CA1010: Koleksiyonlar genel arabirim uygulamalıdır

CA1000: Genel türlerde statik üyeleri belirtme

CA1002: Genel listeleri gösterme

CA1006: Üye imzalarında genel türleri iç içe kullanmayın

CA1004: Genel yöntemler tür parametresi sağlamalıdır

CA1007: Uygun yerlerde genel türler kullanın

Ayrıca bkz.

Başvuru

Genel Türler (C# Programlama Kılavuzu)