Entwickler-Ecke
C# - Die Sprache - Event mit Message erstellen
mikeb69 - Fr 15.08.08 08:45
Titel: Event mit Message erstellen
hallo,
ich programmiere seit einiger zeit mit vb.net und möchte meine kompetenzen nun erweitern.
nun meine frage:
so würde ich ein event mit message in vb.net erstellen
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| Public Interface IClass Event meinevent(ByVal msg As String) End Interface
Public Class Class1 Implements IClass
Public Event meinevent(ByVal msg As String) Implements IClass.meinevent End Class |
jetzt hab ich versucht das nach c# zu konvertieren
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| namespace PowerFileWatcher { interface IFileWatcher { event EventHandler ObjectChanged; } }
namespace PowerFileWatcher { class ClassWatchFile : IFileWatcher {
#region IFileWatcher Members
public event EventHandler ObjectChanged;
#endregion
public void Main() { } } } |
mir gelingt es nicht dem c# event eine message zu verpassen - was muss ich an meinem code ändern ?
gruss
mikeb69
Moderiert von
Christian S.: Code- durch C#-Tags ersetzt
Th69 - So 17.08.08 11:34
Du mußt dafür einen eigenen Event-Handler definieren (mittels des Schlüsselworts 'delegate'):
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| namespace PowerFileWatcher { interface IFileWatcher { delegate void MyEventHandler(string message); event MyEventHandler ObjectChanged; } }
class ClassWatchFile : IFileWatcher { #region IFileWatcher Members
public event MyEventHandler ObjectChanged;
#endregion } |
mikeb69 - So 17.08.08 16:31
hallo th69,
danke - jedoch meldet er mir da einen fehler
Interfaces can not declare types
nehm ich den delegate aus dem interface raus - wird logischerweise kein fehler gemeldet.
EDIT:
ich bin jetzt soweit, dass ich das hier habe
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| namespace PowerFileWatcher { public delegate void MyEventHandler(string message); interface IFileWatcher { event MyEventHandler ObjectChanged; } }
class ClassWatchFile : IFileWatcher { #region IFileWatcher Members public event MyEventHandler ObjectChanged;
#endregion
private static void einesub { ObjectChanged } } |
nur gibt es auch hier eine klippe zu umschiffen
An object reference is required for non static ....
danke
mikeb69
Th69 - Mo 18.08.08 13:14
Sorry für den Interface-Fehler.
Und dein letzter Fehler liegt daran, daß du von einer statischen Methode aus nicht direkt auf nicht-statische Member zugreifen kannst (in VB.NET dürfte das ja nicht anders sein ! -)
Du mußt dich also entscheiden, beides statisch oder besser nicht-statisch:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| private void OnObjectChanged(string message) { if(ObjectChanged != null) ObjectChanged(message); } |
mikeb69 - Mo 18.08.08 16:23
hallo th69,
ok - danke.
soweit passt nun alles.
das event wird dennoch nicht ausgelöst, weill wir im code auf NULL prüfen und das event NULL ist.
ich denke das krieg ich hin - sollte in etwa so laufen, wie mit meinem timer event.
C#-Quelltext
1: 2:
| t.Elapsed += new System.Timers.ElapsedEventHandler(t_Tick); |
danke
mikeb69
Christoph1972 - So 21.09.08 09:32
@th69
Th69 hat folgendes geschrieben: |
{
// dies ist der korrekte Aufruf für ein Event in C#, d.h. erst auf null überprüfen und anschließend die (sogenannten) abonnierten Methode(n) aufrufen
if(ObjectChanged != null)
ObjectChanged(message);
}
[/cs] |
warum wir eine Prüfung auf null durchgeführt? Sorry, ich bin ebenfalls Ein-Umsteiger von VB.Net -> C#
[EDIT]
Ich habe gerade mal in der Hilfe nachgeschaut, da rufen die das Event einfach ohne Prüfung auf..
[END EDIT]
Gruß
Christoph
Christian S. - So 21.09.08 10:48
Wenn niemand einen Event-Handler hinzugefügt hat (dann ist ObjectChanged == null), ist nichts da zum Aufrufen und dann dürfte eine Fehlermeldung geben.
Christoph1972 - So 21.09.08 11:14
Ah ja, Ok. Wenn ich den Event-Handler selbst zugefügt habe kann ich mir die Prüfung also sparen.
Vielen Dank!
Gruß
Christoph
Th69 - So 21.09.08 14:05
Du solltest trotzdem immer die Prüfung vornehmen (besser als irgendwann mal eine Null-Exception zu erhalten).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!