2 Stimmen

Ereignisbehandlungs/ -rufcode-Schnipsel

Ich würde gerne Meinungen zum untenstehenden Code-Schnipsel hören. Gibt es etwas, das verbessert werden kann? Entspricht die Benennung des Ereignishandlers/-auslösers bewährten Praktiken? Ich weiß, dass es nicht besonders nützlich ist, Ereignisse in derselben Klasse zu behandeln und auszulösen, aber dies ist nur ein Ausschnitt.

public class MyControl
{
    public MyControl()
    {
        this.LogWritten += this.HandleMyControlLogWritten;
    }

    // Ereignishandler
    void HandleMyControlLogWritten(object sender, EventArgs e)
    {
    }

    // Ereignisobjekt
    public event Action LogWritten;

    // Ereignisauslöser
    protected virtual void OnLogWritten(EventArgs e)
    {
        if (this.LogWritten != null)
        {
            this.LogWritten(this, e);
        }
    }
}

6voto

Reed Copsey Punkte 536986

Die wichtigste Änderung, die ich empfehlen würde, wäre, eine Kopie des Ereignishandlers zu erhalten:

// Event raiser
protected virtual void OnLogWritten(EventArgs e)
{
    var handler = this.LogWritten;
    if (handler != null)
    {
        handler(this, e);
    }
}

Dies ist wichtig, wenn Sie planen, diese Klasse irgendwann in einem Multi-Thread-Szenario zu verwenden. Daher halte ich es für eine gute "Best Practice", sich daran zu gewöhnen. Das Problem ist, dass bei Verwendung in mehreren Threads ohne Erstellen der Kopie möglich ist, dass der einzige angefügte "Handler" zwischen der Nullprüfung und der Aufrufung abbestellt wird, was einen Laufzeitfehler verursachen würde. Durch Kopieren in eine temporäre Variable (die var handler = this.LogWritten; Zeile) erstellen Sie effektiv eine "Snapshot" der Abonnentenliste und überprüfen diese anschließend auf Null und rufen sie bei Bedarf auf.

Die andere Änderung betrifft die Ereigniserklärung selbst. Anstatt Action zu verwenden:

// Event object
public event Action LogWritten;

Würde ich empfehlen, EventHandler (wenn Sie eine benutzerdefinierte EventArgs-Unterklasse verwenden möchten) oder EventHandler (für standardmäßige EventArgs ) zu verwenden. Dies sind eher "Standardpraktiken" und entsprechen dem, was andere Entwickler erwarten:

// Event object
public event EventHandler LogWritten;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X