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 user profile iconChristian 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)
{
    // 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);
}


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:
//Tick Event des Timers hinzufügen
            t.Elapsed += new System.Timers.ElapsedEventHandler(t_Tick);


danke

mikeb69


Christoph1972 - So 21.09.08 09:32

@th69


user profile iconTh69 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).