CA1003: Użyj wystąpień obsługi zdarzeń generycznych
TypeName |
UseGenericEventHandlerInstances |
CheckId |
CA1003 |
Kategoria |
Microsoft.Design |
Zmiana kluczowa |
Kluczowa |
Przyczyna
Typ zawiera pełnomocnika zwracającego wartość typu void, którego podpis zawiera dwa parametry (pierwszy typu obiekt i drugi typu, który można przypisać do EventArgs) i zawierający zestaw odwołujący się do Program .NET Framework 2,0.
Opis reguły
Przed Program .NET Framework 2,0, aby przekazać informacje niestandardowe do obsługi zdarzeń, należało zadeklarować nowego pełnomocnika, który określał klasę dziedziczącą po klasie EventArgs.Od Program .NET Framework 2,0, który wprowadził delegat EventHandler to już nie jest prawdą.Delegat generyczny pozwala używać razem z obsługą zdarzeń dowolnej klasy pochodzącej od EventArgs.
Jak naprawić naruszenia
Aby naprawić naruszenie tej reguły, należy usunąć delegata i zastąpić jego wykorzystanie używając delegata EventHandler.Jeżeli delegat jest generowany automatycznie przez kompilator Visual Basic, należy zmienić składnię deklaracji zdarzenia, aby używała delegata EventHandler.
Kiedy pominąć ostrzeżenia
Nie należy pomijać ostrzeżenia dotyczącego tej reguły.
Przykład
Poniższy przykład pokazuje delegata, który narusza regułę.W przykładzie Visual Basic komentarze opisują sposób zmodyfikować przykład, aby spełnić regułę.Dla przykładu w języku C# poniższy przykład przedstawia zmodyfikowany kod.
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();
}
}
}
W następującym przykładzie usunięto deklarację delegata z poprzedniego przykładu, który spełnia regułę i zastąpiono jego użycie w metodach ClassThatRaisesEvent i ClassThatHandlesEvent delegatem 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();
}
}
}
Powiązane reguły
CA1005: Unikaj nadużywania parametrów na typach generycznych
CA1010: Kolekcje powinny implementować interfejs generyczny
CA1000: Nie deklaruj statycznych elementów członkowskich na typach generycznych
CA1002: Nie ujawniaj list generycznych
CA1006: Nie zagnieżdżaj typów generycznych w podpisach elementu członkowskiego
CA1004: Generyczne metody powinny dostarczyć parametry typu
CA1007: Używaj danych generycznych wszędzie, gdzie jest to odpowiednie