Hey,
mein erster Beitrag hier.
Bisher hatte ich nur mit C++ und Java gearbeitet und muss jetzt was in C# machen. Zur Sache:
Ich bin dran ein Spiel zu programmieren, hierzu verwende ich XNA. Implementiert wird gerade ein ScreenManager der Objekte der Klasse Screen verwaltet und dann entsprechend auf den Bildschirm malt. Das funktioniert an sich ganz gut. Um Fehler auszuschliessen hab ich Unit-Tests geschrieben und sie gehen nicht. Ich komme dem Fehler nicht so ganz auf die Spur.
Es gibt insgesamt drei Klassen: ScreenManager welche static ist und Objekte der Klasse Screen verwaltet, welche abstract ist. Sowie dann noch die von Screen geerbte Klasse MainScreen. Getestet wird im Moment nur die ScreenManager-Klasse mit ScreenManagerTest welche von Game erbt.
Um zu testen ob zum ScreenManager ein Objekt von MainScreen hinzugefuegt werden kann folgender Testcase:
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:
| [TestMethod] public void AddScreenTest() { const string s1 = "MainScreen1"; const string s2 = "MainScreen2"; const string s3 = "MainScreen3";
var graphicsDevice = new GraphicsDeviceManager(this).GraphicsDevice; Screen screen1 = new MainScreen(graphicsDevice, s1); Screen screen2 = new MainScreen(graphicsDevice, s2); Screen screen3 = new MainScreen(graphicsDevice, s3); ScreenManager.AddScreen(screen1); ScreenManager.AddScreen(screen2); ScreenManager.AddScreen(screen3); Assert.AreEqual(2, ScreenManager.GetScreenNumber()); Assert.IsNotNull(ScreenManager.GetScreen(0)); Assert.IsNotNull(ScreenManager.GetScreen(1)); Assert.AreEqual(screen1, ScreenManager.GetScreen(0)); Assert.AreEqual(screen2, ScreenManager.GetScreen(1)); } |
Das Problem ist jetzt dass es in Zeile 12 beim anlegen des Objektes zu einer Null-Pointer-Exception kommt. Diese kommt aus dem Konstruktor von MainScreen:
C#-Quelltext
1: 2: 3:
| public MainScreen(GraphicsDevice device, string name) : base(device, name) { } |
welcher den Konstruktor von Screen aufruft:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| protected Screen(GraphicsDevice device, string name) { if (device == null) { throw new ArgumentNullException("device"); } Name = name; mDevice = device; } |
Zeile 7 mit Name = name macht hierbei ein Problem. Per Debugger habe ich rausgefunden, dass "name" einen richtigen Wert beinhaltet, "Name" hingegen nicht. Es wird also nicht richtig kopiert...
Die Property Name:
C#-Quelltext
1:
| public string Name { get; private set; } |
Ich habe nicht so recht eine Ahnung warum es zu einem Fehler kommt.
Dachte erst das liegt am private des set, rein logisch ueberlegt ist das natuerlich Unsinn. Trotzdem mal auf public gesetzt und den gleichen Effekt gehabt. Wenn ich mit dem Debugger das Objekt genauer anschaue, stell ich fest dass "name" zwei mal vorkommt, obwohl es doch nur einmal da sein sollte?! C# verwirrt mich hier etwas, waere super wenn jemand von euch eine Antwort kennt.
Danke schon mal fuer die Hilfe!