Ich habe eine einfache abstrakte Klasse:Invoke Base Event-Handler in C# 6
abstract class Lesson
{
public event EventHandler<SpeakEventArgs> Speak;
public string OpeningMessage { get; set; }
public string ClosingMessage { get; set; }
public bool completed { get; private set; } = false;
abstract public void Do();
}
Und eine einfache Unterklasse:
class BubbleSort : Lesson
{
public override void Do()
{
base.Speak?.Invoke(this, new SpeakEventArgs { Message = OpeningMessage });
}
}
Die Unterklasse verwendet die C# 6 Null-Konditionaloperator ?.
. Dieser Code gibt dem Fehler
die Veranstaltung ‚Lesson.Speak‘ nur auf der linken Seite erscheinen kann von + = oder - = (außer wenn innerhalb des Typs ‚Lektion‘ verwendet)
Sicher als Unterklasse bin ich hier innerhalb des Typs 'Lesson'? Wie mache ich diesen Aufruf des Basisklassenereignisses innerhalb der Unterklasse?
'this.Speak (this, e);' ist nicht Thread-sicher, ist es möglich, etwas aus dem Ereignis zwischen dem Null-Check und dem Aufruf abzubestellen, stattdessen sollten Sie die Handler auf ein Objekt kopieren, dann überprüfen das für Null und Anruf von dort – MikeT
@MKeT, die Sie absolut nichts bekommt; Du änderst einfach die Wettlaufsituation, ohne sie zu entfernen. Jetzt haben Sie ein Ereignis ausgelöst, wenn es nicht sein sollte. – InBetween
@MikeT Ja, es ist nicht Thread sicher, aber es gibt nicht vor zu sein. Was Sie vorschlagen, ist auch nicht. Es ist tatsächlich ein häufiger Fehler, du solltest das nicht tun. Siehe http://blog.stephencleary.com/2009/06/threadsafe-events.html – ken2k