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