CA1003: Algemene gebeurtenis-handler-exemplaren gebruiken
Eigenschappen | Weergegeven als |
---|---|
Regel-id | CA1003 |
Titel | Algemene gebeurtenis-handler-exemplaren gebruiken |
Categorie | Ontwerpen |
Oplossing is brekend of niet-brekend | Breken |
Standaard ingeschakeld in .NET 9 | Nee |
Oorzaak
Een type bevat een gemachtigde die ongeldigheid retourneert en waarvan de handtekening twee parameters bevat (het eerste een object en het tweede een type dat kan worden toegewezen aan EventArgs) en de bijbehorende assemblydoelen .NET.
Deze regel kijkt standaard alleen naar extern zichtbare typen, maar dit kan worden geconfigureerd.
Beschrijving van regel
Voordat .NET Framework 2.0, om aangepaste gegevens door te geven aan de gebeurtenis-handler, moest een nieuwe gemachtigde worden gedeclareerd die een klasse heeft opgegeven die is afgeleid van de System.EventArgs klasse. In .NET Framework 2.0 en latere versies staat de algemene System.EventHandler<TEventArgs> gemachtigde elke klasse toe die is afgeleid van EventArgs , samen met de gebeurtenis-handler te gebruiken.
Schendingen oplossen
Als u een schending van deze regel wilt oplossen, verwijdert u de gemachtigde en vervangt u het gebruik ervan door de System.EventHandler<TEventArgs> gemachtigde te gebruiken.
Als de gemachtigde automatisch wordt gegenereerd door de Visual Basic-compiler, wijzigt u de syntaxis van de gebeurtenisdeclaratie om de System.EventHandler<TEventArgs> gemachtigde te gebruiken.
Wanneer waarschuwingen onderdrukken
Een waarschuwing van deze regel niet onderdrukken.
Code configureren om te analyseren
Gebruik de volgende optie om te configureren op welke onderdelen van uw codebase deze regel moet worden uitgevoerd.
U kunt deze optie configureren voor alleen deze regel, voor alle regels waarop deze van toepassing is, of voor alle regels in deze categorie (ontwerp) waarop deze van toepassing is. Zie de configuratieopties voor de codekwaliteitsregel voor meer informatie.
Specifieke API-oppervlakken opnemen
U kunt configureren op welke onderdelen van uw codebase deze regel moet worden uitgevoerd, op basis van hun toegankelijkheid, door de optie api_surface in te stellen. Als u bijvoorbeeld wilt opgeven dat de regel alleen moet worden uitgevoerd op het niet-openbare API-oppervlak, voegt u het volgende sleutel-waardepaar toe aan een .editorconfig-bestand in uw project:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Notitie
Vervang het XXXX
deel van CAXXXX
door de id van de toepasselijke regel.
Opmerking
In het volgende voorbeeld ziet u een gemachtigde die de regel schendt. In het Visual Basic-voorbeeld beschrijven opmerkingen hoe u het voorbeeld kunt wijzigen om aan de regel te voldoen. Voor het C#-voorbeeld volgt een voorbeeld waarin de gewijzigde code wordt weergegeven.
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();
}
}
Met het volgende codefragment wordt de declaratie van de gemachtigde uit het vorige voorbeeld verwijderd, die voldoet aan de regel. Het vervangt het gebruik in de ClassThatRaisesEvent
en ClassThatHandlesEvent
methoden door gebruik te maken van de System.EventHandler<TEventArgs> gemachtigde.
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();
}
}
Gerelateerde regels
- CA1005: Vermijd overmatige parameters voor algemene typen
- CA1010: Verzamelingen moeten algemene interface implementeren
- CA1000: Geen statische leden declareren voor algemene typen
- CA1002: algemene lijsten niet beschikbaar maken