CA1003: Általános eseménykezelő példányok használata
Tulajdonság | Érték |
---|---|
Szabályazonosító | CA1003 |
Cím | Általános eseménykezelő példányok használata |
Kategória | Design |
A javítás kompatibilitástörő vagy nem törik | Törés |
Alapértelmezés szerint engedélyezve a .NET 8-ban | Nem |
Ok
A típus tartalmaz egy olyan delegáltat, amely érvénytelen értéket ad vissza, és amelynek aláírása két paramétert tartalmaz (az első egy objektumot, a másodikat pedig az EventArgshez rendelhető típust), valamint a szerelvényt tartalmazó .NET-célokat.
Ez a szabály alapértelmezés szerint csak külsőleg látható típusokat tekint meg, de ez konfigurálható.
Szabály leírása
A 2.0-s .NET-keretrendszer előtt ahhoz, hogy egyéni adatokat továbbíthasson az eseménykezelőnek, deklarálni kellett egy új meghatalmazottat, aki az osztályból System.EventArgs származtatott osztályt adott meg. A .NET-keretrendszer 2.0-s és újabb verzióiban az általános System.EventHandler<TEventArgs> delegált lehetővé teszi, hogy a származtatott EventArgs osztályok az eseménykezelővel együtt legyenek használva.
Szabálysértések kijavítása
A szabály megsértésének kijavításához távolítsa el a meghatalmazottat, és cserélje le annak használatát a System.EventHandler<TEventArgs> meghatalmazott használatával.
Ha a delegáltat a Visual Basic fordító automatikusan generálja, módosítsa az eseménydeklaráció szintaxisát a System.EventHandler<TEventArgs> meghatalmazott használatára.
Mikor kell letiltani a figyelmeztetéseket?
Ne tiltsa el a szabály figyelmeztetését.
Kód konfigurálása elemzéshez
A következő beállítással konfigurálhatja, hogy a kódbázis mely részein futtassa ezt a szabályt.
Ezt a beállítást konfigurálhatja csak ehhez a szabályhoz, az összes szabályhoz, vagy az ebben a kategóriában (Tervezés) szereplő összes szabályhoz, amelyekre vonatkozik. További információ: Kódminőségi szabály konfigurációs beállításai.
Adott API-felületek belefoglalása
A kódbázis azon részeit konfigurálhatja, amelyeken futtathatja ezt a szabályt az akadálymentességük alapján. Ha például meg szeretné adni, hogy a szabály csak a nem nyilvános API-felületen fusson, adja hozzá a következő kulcs-érték párot a projekt egyik .editorconfig fájljához:
dotnet_code_quality.CAXXXX.api_surface = private, internal
Példa
Az alábbi példában egy olyan meghatalmazott látható, aki megsérti a szabályt. A Visual Basic-példában a megjegyzések bemutatják, hogyan módosítható a példa a szabálynak megfelelően. A C# példa esetében egy példa a módosított kódot mutatja be.
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 Main()
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();
}
}
Az alábbi kódrészlet eltávolítja a deklarációt az előző példából, amely megfelel a szabálynak. A delegált használatával lecseréli a használatot a metódusokban és ClassThatHandlesEvent
a ClassThatRaisesEvent
System.EventHandler<TEventArgs> metódusokban.
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();
}
}
Kapcsolódó szabályok
- CA1005: Az általános típusok túlzott paramétereinek elkerülése
- CA1010: A gyűjteményeknek általános felületet kell implementálniuk
- CA1000: Ne deklarálja a statikus tagokat általános típusok esetében
- CA1002: Ne tegye közzé az általános listákat
Kapcsolódó információk
Visszajelzés
https://aka.ms/ContentUserFeedback.
Hamarosan elérhető: 2024-ben fokozatosan kivezetjük a GitHub-problémákat a tartalom visszajelzési mechanizmusaként, és lecseréljük egy új visszajelzési rendszerre. További információ:Visszajelzés küldése és megtekintése a következőhöz: