Entwickler-Ecke
C# - Die Sprache - Verzweifle an Ereignissen
KeepItSimple - Do 26.10.06 00:30
Titel: Verzweifle an Ereignissen
Hallo zusammen,
ich beschäftige mich gerade mit dem Buch "Visual C# 2005", bin da aber noch bei Konsolenprogrammen.
Der Autor behandelt gerade Ereignisse und ich versuche das nachzucoden. Allerdings scheitert das Ganze immer aus einem mir unverständliche Grund, der sogar auftritt, wenn ich den Quellcode des Autors kopiere. Der Fehler lautet:
"Fehler CS0120: Für das nicht statische Feld, die Methode oder die Eigenschaft "EventTest.Program.RadiusError(EventTest.Circle)" ist ein Objektverweis erforderlich."
Der Fehler betrifft diese Codezeile:
C#-Quelltext
1:
| kreis.MeasureError += new MeasureErrorEventHandler(RadiusError); |
Zum besseren Verständnis poste ich mal den ganzen Quelltext. Zuerst die Klasse mit Main:
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:
| using System; using System.Collections.Generic; using System.Text;
namespace EventTest { class Program { static void Main(string[] args) { Circle kreis = new Circle();
kreis.MeasureError += new MeasureErrorEventHandler(RadiusError); kreis.Radius = -1; Console.ReadLine(); }
public void RadiusError(Circle sender) { Console.WriteLine("Unzulässiger negativer Radius."); Console.Write("Neueingabe: "); sender.Radius = Convert.ToDouble(Console.ReadLine()); } } } |
Und hier die zweite Klasse:
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: 26:
| using System; using System.Collections.Generic; using System.Text;
namespace EventTest { public delegate void MeasureErrorEventHandler(Circle c);
public class Circle { double radius = 0; public event MeasureErrorEventHandler MeasureError;
public double Radius { get { return radius; } set { if (value >= 0) radius = value; else if (MeasureError != null) MeasureError(this); } } } } |
Ich kann mir den Fehler nicht erklären, da ich in C# noch nicht so gut bin und alles so gemacht habe, wie der Autor schreibt. Falls mir jemand helfen kann, wäre ich sehr dankbar.
Vielen Dank im voraus.
Gruß Tom
Christian S. - Do 26.10.06 10:13
Hallo!
Die Main-Methode einer Konsolenanwendung ist statisch, dass heißt sie ist eine Klassenmethode. Nun ist RadiusError aber eine nicht-statische Methode, die also zu einer Instanz gehört. Daher kannst Du aus einer Klassenmethode nicht drauf zugreifen.
Grüße
Christian
KeepItSimple - Do 26.10.06 11:43
Ahhh ja, Danke.
Ich habe das jetzt in eine weitere Klasse ausgelagert - jetzt gehts! Ich weiß nur nicht, ob das ein gute Lösung ist. Wenn jemand weiß, wie mans besser machen kann, wäre ich sehr erfreut, es zu hören (lesen). Dankeschön.
Hier mal der neue Code:
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: 26: 27:
| class Program { public static void Main(string[] args) { Testklasse test = new Testklasse(); test.TestMethode(); } } public class Testklasse { public void TestMethode() { Circle meinKreis = new Circle(); meinKreis.MeasureError += new MeasureErrorHandler(RadiusError); meinKreis.Radius = -1; Console.WriteLine("Radius = {0}", meinKreis.Radius); Console.ReadLine(); } public void RadiusError(Circle sender) { Console.WriteLine("Unzulässiger negativer Radius."); Console.Write("Neueingabe: "); sender.Radius = Convert.ToDouble(Console.ReadLine()); } } |
Schönen Tag noch
Gruß Tom
Kha - Do 26.10.06 12:50
Du benötigst keine weitere Klasse. Entweder erstellst du in Main eine Program-Instanz oder deklarierst RadiusError als static.
KeepItSimple - Do 26.10.06 16:41
Hi,
hab das jetzt mal gemacht mit einer Instanz von "Program". Vielen Dank für den Tip.
Ist das ein üblicher Weg? Ich meine, die Klasse in der sich Main befindet zu instanzieren?
Wie auch immer, ich finde es elegant.
Schönen Gruß
Tom
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!