Anfänger sucht Ratschlag
-
Guten Tag
Ich bin gerade dabei, meine Fähigkeiten in C# auszutesten, was ich bisher gelernt habe und auch neues auszuprobieren.
Im Moment schlage ich mich mit nachfolgenden Code herum. Ich bekomme es jedoch nur nicht hin, wie ich eine "Endlossschleife" hinbekomme. Sprich: Nach Auswahl von einer Menüpunkt, dass mir der "Auswahlmenü" erneut angezeigt wird.
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { Console.WriteLine("Wie soll dein Monster heißen?"); String name = Convert.ToString(Console.ReadLine()); int alter = 0; Spieler Charakter = new Spieler(name, alter); Console.WriteLine(""); Console.WriteLine("Bitte treffe deine Auswahl:"); Console.WriteLine("-----------------------------"); Console.WriteLine("1.: Essen geben"); Console.WriteLine("2.: Spielen"); Console.WriteLine("3.: Beenden"); Console.WriteLine("-----------------------------"); Console.WriteLine(""); String crl = Console.ReadLine(); switch(crl) { case "1": Charakter.Essen(name); Charakter.Aelter(name, ref alter); break; case "2": Charakter.Spielen(name); break; case "3": default: Console.WriteLine("Programm wird beendet..."); break; } } } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication3 { class Spieler { public Spieler() { } public Spieler(String name, int alter) { int Alter = alter; String Name = name; Console.WriteLine(Name + " ist da und er ist " + Alter + " Jahre alt."); } public void Essen(String name) { Console.WriteLine(name + " isst gerade einen Apfel."); } public void Spielen(String name) { Console.WriteLine(name + " spielt mit dem Ball."); Console.ReadLine(); } public void Aelter(String name, ref int alter) { Console.WriteLine(name + " ist nun " + ++alter + " Jahre alt geworden."); Console.ReadLine(); } } }
-
Schreib string bitte klein, sonst schaut das so nach Java aus...
Naja, du hast gar keine Schleife drin, also mach einfach eine rein, irgendwie so:
bool done = false; while (!done) { ... case "3": ... done = true; }
-
auswahl: Console.WriteLine(""); Console.WriteLine("Bitte treffe deine Auswahl:"); Console.WriteLine("-----------------------------"); Console.WriteLine("1.: Essen geben"); Console.WriteLine("2.: Spielen"); Console.WriteLine("3.: Beenden"); Console.WriteLine("-----------------------------"); Console.WriteLine(""); String crl = Console.ReadLine(); switch(crl) { case "1": Charakter.Essen(name); Charakter.Aelter(name, ref alter); break; case "2": Charakter.Spielen(name); break; case "3": default: Console.WriteLine("Programm wird beendet..."); break; } goto auswahl;
-
Goto ist natürlich auch eine Lösung, aber mittelfristig gesehen hat das unangenehme Nebenwirkungen, weil man dafür in die Hölle kommt:
http://www.geekherocomic.com/2009/08/28/the-8th-deadly-sin/index.html
-
Vielen Dank Mechanics,
so einfach war das.
Ein "goto" möchte ich persönlich nicht verwenden. Ich habe gelesen, dass man so etwas unterlassen sollte und alles andere als Hilfreich ist. Und wenn ich es lerne, dann möchte ich es richtig lernen. Danke trotzdem!
-
Besserer Vorschlag: nimm einfach Application.Exit()
-
Ganz schlechter Vorschlag.
Verzögert bloss das Lernen von Techniken die an jeder Stelle funktionieren, nicht bloss in dem Spezialfall wenn man die Anwendung beenden will.
-
berniebutt schrieb:
Besserer Vorschlag: nimm einfach Application.Exit()
Täte das auch einen offenen StreamWriter flushen?
-
Application.Exit() beendet nur alle Windows und Message-Loops.
Im Falle eines offenen StreamWriter erfolgt eine Exception.
Allein die Methode .Closing() wird noch erreicht.Guter Hinweis. Application.Exit() mit etwas Vorsicht einsetzen!
Das geht für die gestellte Frage eines Anfängers nun aber zu weit.
Meinung geändert: wie geschildert mit einer while-Schleife regeln.
-
berniebutt schrieb:
Application.Exit() beendet nur alle Windows und Message-Loops.
Im Falle eines offenen StreamWriter erfolgt eine Exception.
Allein die Methode .Closing() wird noch erreicht.Hätt ich auch nicht gewusst. Kann volkard etwa .NET?
-
berniebutt schrieb:
Application.Exit() beendet nur alle Windows und Message-Loops.
Im Falle eines offenen StreamWriter erfolgt eine Exception.
Allein die Methode .Closing() wird noch erreicht.Quatsch (der Teil mit der Exception).
-
Mechanics schrieb:
berniebutt schrieb:
Application.Exit() beendet nur alle Windows und Message-Loops.
Im Falle eines offenen StreamWriter erfolgt eine Exception.
Allein die Methode .Closing() wird noch erreicht.Hätt ich auch nicht gewusst. Kann volkard etwa .NET?
Da brauchst du keine Kenntnisse in .Net. Da reicht ein wenig nachdenken, woher
Application.Exit
eigentlich kommt. Nämlich von WinForms oder WPF. Das sind Bibliotheken komplett unabhängig von IO wie bei einem Stream. Der Stream meldet sich sicher nicht bei einer Application an oder umgekehrt. Das läuft völlig unabhängig. Zudem garantiert C# nirgendwo, dass ein Stream beim Beenden des Programmes automatisch geflusht wird. Sowas umzusetzen wäre auch etwas krank aufwendig bis unmöglich.Aber abgesehen davon,
Application.Exit
macht, glaube ich, etwas anderes, als gewisse hier denken. Lest mal selber nach:
http://msdn.microsoft.com/en-us/library/ms157894.aspxIn WPF hat man das sinnvollerweise in
Application.Shutdown
umbenannt:
http://msdn.microsoft.com/en-us/library/ms597013.aspxMeint ihr womöglich
Environment.Exit
?
http://msdn.microsoft.com/en-us/library/system.environment.exit.aspxAber nach wie vor gilt: Nicht zu empfehlen.
Das mit der Exception beim
StreamWriter
ist tatsächlich Quatsch. Wie kommst du auf die Idee berniebutt? Wenn schon kommt es ja sowieso darauf an, worauf derStreamWriter
schreibt. Also würde es um denBaseStream
gehen. Wenn das zum Beispiel einMemoryStream
ist, dann fliegt da sicherlich keine Exception.
-
Dravere schrieb:
Da brauchst du keine Kenntnisse in .Net. Da reicht ein wenig nachdenken, woher
Application.Exit
eigentlich kommt.Darauf wollte ich nicht hinaus. Ich wollte darauf hinaus, dass ich nicht erwartet hätte, dass volkard überhaupt irgendwas mit .NET am Hut hat.
-
Dravere schrieb:
Das mit der Exception beim
StreamWriter
ist tatsächlich Quatsch. Wie kommst du auf die Idee berniebutt? Wenn schon kommt es ja sowieso darauf an, worauf derStreamWriter
schreibt. Also würde es um denBaseStream
gehen. Wenn das zum Beispiel einMemoryStream
ist, dann fliegt da sicherlich keine Exception.Es sollte überhaupt keine Exception fliegen, egal um was für einen Stream es sich handelt, da bei
Application.Exit
eben nichts geflusht wird. (Was natürlich auch ein Problem ist, wenn man möchte dass derStreamWriter
/Stream
geflusht wird.)Und das was passiert, nämlich dass die
CriticalFinalizerObject
s finalisiert werden, wirft normalerweise auch keine Exceptions, da es Usus ist den Finalizer einesCriticalFinalizerObject
(bzw. eigentlich eines jeden Objekts) so zu implementieren dass er keine Exceptions wirft.
(Bzw. wäre es sowieso egal, da die Exception dann vermutlich an einer Stelle geworfen wird wo sie einfach gefangen und ignoriert wird.)
-
hustbaer schrieb:
Dravere schrieb:
Das mit der Exception beim
StreamWriter
ist tatsächlich Quatsch. Wie kommst du auf die Idee berniebutt? Wenn schon kommt es ja sowieso darauf an, worauf derStreamWriter
schreibt. Also würde es um denBaseStream
gehen. Wenn das zum Beispiel einMemoryStream
ist, dann fliegt da sicherlich keine Exception.Es sollte überhaupt keine Exception fliegen, egal um was für einen Stream es sich handelt, da bei
Application.Exit
eben nichts geflusht wird. (Was natürlich auch ein Problem ist, wenn man möchte dass derStreamWriter
/Stream
geflusht wird.)Hmmm, ok. Ich bin mir jetzt unsicher darüber, was berniebutt hier genau gemeint hat. Aber womöglich habe ich bereits zu weit gedacht, wenn ich mir die Aussage nochmals durchlese. Wenn er meint, dass
Application.Exit
eine Exception wirft, falls noch einStreamWriter
offen ist, dann ist das natürlich kompletter Unsinn.
-
Ich bin auch nicht 100% sicher was er gemeint hat - ich würde nur sagen das ist das was er geschrieben hat.
-
Mechanics schrieb:
Darauf wollte ich nicht hinaus. Ich wollte darauf hinaus, dass ich nicht erwartet hätte, dass volkard überhaupt irgendwas mit .NET am Hut hat.
Kinners, ich bin über .NET hinaus, weil damit Projekte nicht skalieren. Ich hab's ernsthaft versucht. Es geht einfach nicht.
-
Mechanics schrieb:
berniebutt schrieb:
Application.Exit() beendet nur alle Windows und Message-Loops.
Im Falle eines offenen StreamWriter erfolgt eine Exception.
Allein die Methode .Closing() wird noch erreicht.Hätt ich auch nicht gewusst. Kann volkard etwa .NET?
Lerne noch mehr bitte: Der CD-Schacht wird geschlossen und in München gibt es einen Stromausfall, wenn man das macht. Sorry, auf berniebutts Vermutung hatte ich nicht geantwortet, weil sie zu absurd/trollig war. Die Nichtantwort war keine Bekräftigung seiner These.
-
volkard schrieb:
weil damit Projekte nicht skalieren
WTF?