Skip to content

Commit effe2a5

Browse files
Revise L22
1 parent e171ee6 commit effe2a5

1 file changed

Lines changed: 15 additions & 6 deletions

File tree

22_Events.md

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ C# etabliert für die Nutzung der Pub-Sub Kommunikation *Events*. Dies sind spez
183183
{{0-1}}
184184
********************************************************************************
185185

186-
Der Publisher ist eine Klasse, die ein Delegaten enthält. Der Publisher entscheidet damit darüber, wann Nachrichten versandt werden.
186+
Der Publisher ist eine Klasse, die eine Delegate-Variable enthält. Der Publisher entscheidet damit darüber, wann Nachrichten versandt werden.
187187
Auf der anderen Seite finden sich die Subscriber-Methoden, die ausgehend vom aktivierten Delegaten im Publisher zur Ausführung kommen. Ein Subscriber hat keine Kenntnis von anderen Subscribern. Events sind ein Feature aus C# dass dieses Pattern formalisiert.
188188

189189
> Merke: Ein Event ist ein Klassenmember, dass die Features des Delegatenkonzepts nutzt, um eine Publisher-Subscribe Interaktion zu realisieren.
@@ -205,7 +205,7 @@ public class Publisher{
205205

206206
// Schritt 3
207207
// Wir implementieren das "Feuern" des Events
208-
public magicMethod(){
208+
public void magicMethod(){
209209
if (oldA != newA) OnAChangedHandler();
210210
}
211211
}
@@ -214,7 +214,7 @@ public class Publisher{
214214
// Implementieren des Subscribers - in diesem Fall wurde eine separate Klasse
215215
// gewählt.
216216
public class Subscriber{
217-
public static void m_OnPropertyChanged(){
217+
public void m_OnPropertyChanged(){
218218
Console.WriteLine("A was changed!");
219219
}
220220
}
@@ -225,6 +225,7 @@ public static void Main(string[] args){
225225
Publisher myPub = new Publisher();
226226
Subscriber mySub = new Subscriber();
227227
myPub.OnAChangedHandler += new varAChangedHandler(mySub.m_OnPropertyChanged);
228+
myPub.magicMethod();
228229
}
229230
```
230231

@@ -234,7 +235,7 @@ Welche Konsequenzen ergeben sich daraus?
234235

235236
+ Es ist eine 1:n Relation. Ein Ereignis entstammt einem Publisher, kann aber mehrere Subscriber adressieren.
236237

237-
+ Ereignisse, die keine Subscriber haben, werden nie ausgelöst. Das bedeutet, dass ein Publisher die Subscriber kennen muss.
238+
+ Achtung: Ereignisse, die keine Subscriber haben werfen NullReferenzException aus, wenn sie ausgelöst werden (OnAChangedHandler?.Invoke();).
238239

239240
+ Ereignisse werden in der Regel verwendet, um Benutzeraktionen wie Mausklicks oder Menüauswahlen in GUI-Schnittstellen zu signalisieren.
240241

@@ -268,7 +269,7 @@ public event VarAChangedHandler AChanged
268269
}
269270
```
270271

271-
2. Der Compiler sucht innerhalb der Publisher Klasse nach Referenzen, die auf AChanged und lenkt diese auf das private Delegate um.
272+
2. Der Compiler sucht innerhalb der Publisher Klasse nach Referenzen auf AChanged und lenkt diese auf das private Delegate um.
272273
3. Der Compiler mappt alle += Operationen außerhalb auf die Zugriffsmethoden add and remove.
273274

274275
********************************************************************************
@@ -372,14 +373,22 @@ class Program {
372373
**Ja, aber ... ** Was unterscheidet eine Delegate von einem Event? Was würde passieren, wenn wir
373374
das Key-Wort aus dem Code entfernen?
374375

375-
Die Implementierung wäre nicht so robust, da folgende Möglichkeiten offen ständen:
376+
Die Implementierung wäre nicht so robust, da folgende Möglichkeiten offen ständen und damit :
376377

377378
| Eingriff | Bedeutung | Verhindert |
378379
| --------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | ---------- |
379380
| `GoogleStock.OnPropertyPriceChanged = null;` | Löscht alle Callback-Handler | ja |
380381
| `GoogleStock.OnPropertyPriceChanged = DelPriceChangedHandler(MailService.stock_OnPropertyChanged);` | Setzt einen einzigen Handler (und löscht alle anderen) | ja |
381382
| `GoogleStock.OnPropertyPriceChanged.Invoke();` | Auslösen des Events innerhalb eines Subscribers | ja |
382383

384+
Das Weglassen des Schlüsselwortes event untergräbt das Prinzip der Kapselung und führt leicht zu unbeabsichtigtem Verhalten wie z. B. doppelte Aufrufe.
385+
386+
Das event-Keyword dient als Zugriffsmodifizierer für Delegaten und stellt sicher, dass:
387+
388+
- Nur der Publisher das Event auslösen kann,
389+
390+
- Externe Objekte keinen direkten Zugriff auf den Delegaten selbst bekommen.
391+
383392
Was fehlt Ihnen an der Implementierung?
384393

385394
Richtig, die Möglichkeit auf die Daten zurückzugreifen.

0 commit comments

Comments
 (0)