Megosztás a következőn keresztül:


CA1003: Generikus 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 Tervezés
A javítás kompatibilitástörő vagy nem törik Rendkívüli
Alapértelmezés szerint engedélyezve a .NET 9-ben Nem

Ok

A típus tartalmaz egy olyan delegátumot, amelynek nincs visszatérési értéke, és amelynek aláírása két paramétert tartalmaz (az első egy objektum, a második egy EventArgs-hoz rendelhető típus), és a tartalmazó assembly a .NET-et célozza meg.

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 .NET-keretrendszer 2.0 előtt, ahhoz, hogy egyéni információkat lehessen átadni az eseménykezelőnek, új delegáltat kellett deklarálni, amely megadott egy a System.EventArgs osztályból származtatott osztályt. 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> delegált használatára.

Mikor kell letiltani a figyelmeztetéseket?

Ne nyomja el e 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 api_surface beállítással konfigurálhatja, hogy a kódbázis mely részein futtassa 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

Jegyzet

Cserélje le a XXXXCAXXXX részét a vonatkozó szabály azonosítójára.

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 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: {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 delegate deklarációját az előző példából, amely megfelel a szabálynak. A System.EventHandler<TEventArgs> delegált használatával lecseréli annak használatát a ClassThatRaisesEvent és ClassThatHandlesEvent 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: {e.info}");
    }
}

class Test
{
    static void MainEvent()
    {
        var eventRaiser = new ClassThatRaisesEvent();
        var eventHandler = new ClassThatHandlesEvent(eventRaiser);

        eventRaiser.SimulateEvent();
    }
}

Lásd még