CA1003: Använda allmänna händelsehanterarinstanser
Property | Värde |
---|---|
Regel-ID | CA1003 |
Title | Använda allmänna händelsehanterarinstanser |
Kategori | Designa |
Korrigeringen är icke-bakåtkompatibel | Brott |
Aktiverad som standard i .NET 9 | Nej |
Orsak
En typ innehåller ett ombud som returnerar void och vars signatur innehåller två parametrar (det första ett objekt och det andra en typ som kan tilldelas Till EventArgs), och den innehållande sammansättningsmålen .NET.
Som standard tittar den här regeln bara på externt synliga typer, men det kan konfigureras.
Regelbeskrivning
Innan .NET Framework 2.0 måste ett nytt ombud deklareras som angav en klass som härleddes från System.EventArgs klassen för att kunna skicka anpassad information till händelsehanteraren. I .NET Framework 2.0 och senare versioner tillåter det allmänna System.EventHandler<TEventArgs> ombudet att alla klasser som härleds från EventArgs kan användas tillsammans med händelsehanteraren.
Så här åtgärdar du överträdelser
Om du vill åtgärda ett brott mot den här regeln tar du bort ombudet och ersätter dess användning med hjälp av ombudet System.EventHandler<TEventArgs> .
Om ombudet genereras automatiskt av Visual Basic-kompilatorn ändrar du syntaxen för händelsedeklarationen så att ombudet System.EventHandler<TEventArgs> används.
När du ska ignorera varningar
Ignorera inte en varning från den här regeln.
Konfigurera kod för analys
Använd följande alternativ för att konfigurera vilka delar av kodbasen som regeln ska köras på.
Du kan konfigurera det här alternativet för bara den här regeln, för alla regler som gäller för eller för alla regler i den här kategorin (design) som den gäller för. Mer information finns i Konfigurationsalternativ för kodkvalitetsregel.
Inkludera specifika API-ytor
Du kan konfigurera vilka delar av kodbasen som ska köras med den här regeln baserat på deras tillgänglighet. Om du till exempel vill ange att regeln endast ska köras mot den icke-offentliga API-ytan lägger du till följande nyckel/värde-par i en .editorconfig-fil i projektet:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Exempel
I följande exempel visas ett ombud som bryter mot regeln. I Visual Basic-exemplet beskriver kommentarerna hur du ändrar exemplet för att uppfylla regeln. I C#-exemplet följer ett exempel som visar den ändrade koden.
Imports System
Namespace ca1003
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 Main1003()
Dim eventRaiser As New ClassThatRaisesEvent()
Dim eventHandler As New ClassThatHandlesEvent(eventRaiser)
eventRaiser.SimulateEvent()
End Sub
End Class
End Namespace
// 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)
{
SomeEvent?.Invoke(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 MainEvent()
{
var eventRaiser = new ClassThatRaisesEvent();
var eventHandler = new ClassThatHandlesEvent(eventRaiser);
eventRaiser.SimulateEvent();
}
}
Följande kodfragment tar bort ombudsdeklarationen från föregående exempel, som uppfyller regeln. Den ersätter dess användning i ClassThatRaisesEvent
metoderna och ClassThatHandlesEvent
med hjälp av ombudet System.EventHandler<TEventArgs> .
public class CustomEventArgs : EventArgs
{
public string info = "data";
}
public class ClassThatRaisesEvent
{
public event EventHandler<CustomEventArgs>? SomeEvent;
protected virtual void OnSomeEvent(CustomEventArgs e)
{
SomeEvent?.Invoke(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 MainEvent()
{
var eventRaiser = new ClassThatRaisesEvent();
var eventHandler = new ClassThatHandlesEvent(eventRaiser);
eventRaiser.SimulateEvent();
}
}
Relaterade regler
- CA1005: Undvik överdrivna parametrar för generiska typer
- CA1010: Samlingar bör implementera generiskt gränssnitt
- CA1000: Deklarera inte statiska medlemmar på generiska typer
- CA1002: Exponera inte allmänna listor