Hallo Leute. 🙂
Ich habe hier im Forum gelesen, dass das anwenden von einem Anweisungblock, eine Sache des Stils ist. Doch beim programmieren scheint es bei einigen Sachen nicht so zu sein.
Wenn ich zum Beispiel eine for-Schleife ohne Anweisungsblock schreibe:
for (int i = 1; i <= 5; i++)
Console.Write("Geben Sie die {0}. Zahl ein: ", i);
Wird in der Console 5 mal hintereinander der Text *Geben Sie die die X Zahl ein: ausgeführt. Gibt man das ganze mit einem Anweisungsblock ein, wird das ganze wie gewollt 1mal in einer Schleife ausgeführt.
Auch in diesem Code wird ein Anweisungsblock für eine break Anweisung verlangt:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp20
{
class Program
{
static void Main(string[] args)
{
int eingabe, schleife = 0;
while (schleife <= 1)
{
Console.WriteLine("Was möchten Sie tun?");
Console.WriteLine();
Console.WriteLine("Rechnen");
Console.WriteLine("Programm beenden!");
Console.WriteLine();
eingabe = Convert.ToInt32(Console.ReadLine());
if (eingabe == 1)
{
Console.WriteLine("Dann rechnen Sie 10 + 5"); break;
}
else if (eingabe == 2)
{
Console.WriteLine("Programm wird beendet!"); break;
}
else
{
Console.WriteLine("Sie müsseen sich für 1 oder 2 entscheiden!");
Console.WriteLine();
continue;
}
}
schleife++;
}
}
}
Ich verstehe nicht genau, warum man das jetzt einsetzen muss. In meinen Studienheften wird das gar nicht erklärt oder ich habe da was übersehen. Könnt ihr mir das ausführlich erklären? ?(
Die zweite Schleife ist eine While-Schleife. Die Geschichte mit der for-Schleife bezog sich auf den ersten Code. Und das mit der Break ist doch nicht dein ernst?^^
Statt meinen Beitrag zu editieren hab ich ihn gelöscht. Herrlich...
Ich hab tatsächlich Dein break nicht gesehen.
Vermutlich hat meine Auge es - wie es sich gehört - in Zeile für sich erwartet.
So ganz versteh ich ehrlich gesagt Deine Frage nicht.
Dein break in der While-Schleife führt dazu, dass die Schleife und damit das Programm beendet wird.
Kann das sein, dass Du eigentlich ein continue statt einem break willst?
Dein for-Beispiel läuft 5 mal durch, da
for (int i = 1; i <= 5; i++)
Console.Write("Geben Sie die {0}. Zahl ein: ", i);
das selbe wie
for (int i = 1; i <= 5; i++)
{
Console.Write("Geben Sie die {0}. Zahl ein: ", i);
}
ist aber nicht das selbe wie
for (int i = 1; i <= 5; i++)
{
Console.Write("Geben Sie die {0}. Zahl ein: ", i);
break;
}
Der for-Schleifen-Fall hat irgendwie nichts mit dem while-Fall am Hut.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Vielen Dank erstmal, dass du dir Mühe machst, mir zu antworten. 👍
Also, meine Frage war allgemein: Wann muss ich genau einen Anweisungsblock anwenden?
Für die For-Schleife ist es zum Beispiel notwendig einen Anweisungsblock anzuwenden, damit er die Schleife durchlaufen kann. Der 2te Code hatte nichts mit dem ersten zu tun. Meine Frage zielte darauf ab, warum ich einen Anweisungsblock anwenden muss, damit ich einen Break anwenden kann.
😁
Hallo,
stell die Frage besser andersrum: Wann braucht man keinen Anweisungsblock?
Du brauchst ihn nämlich immer, ausser der Block besteht nur aus einer einzigen Anweisung.
Nur in diesem Spezialfall kann man sich den Anweisungsblock mit den geschweiften Klammern sparen.
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Empfehlenswert ist immer Anweisungen in einen Block zu packen, das fördert die Lesbarkeit.
Es gibt ganz wenig Fälle, in denen ich Anweisungen ohne Block in Projekten dulde; dazu gehört eigentlich nur das Abfangen von null-parametern in Methoden.
In meinen Augen wäre es (für alle Sprachen) auch besser gewesen, die Klammern als Pflicht zu nutzen.
public void Methode(string parameter)
{
if (parameter == null) throw new ArgumentNullException(nameof(parameter));
// code...
}
Innerhalb von Code ist es sehr zu empfehlen,immer Blöcke zu verwenden. Immer.
Auch die Microsoft Guidelines empfehlen das ausdrücklich.
Ein Muss sind Blöcke nur, wenn mehr als eine Anweisung ausgeführt werden soll.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Ihr seid Crazy, Jungs! Vielen Dank! Bei mehreren Anweisungen muss man also nen Block anwenden. 😁 👍
Darf ich euch noch eine Frage stellen? Es geht nochmals um diesen Code hier:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp20
{
class Program
{
static void Main(string[] args)
{
int eingabe, schleife = 0;
while (schleife <= 1)
{
Console.WriteLine("Was möchten Sie tun?");
Console.WriteLine();
Console.WriteLine("Rechnen");
Console.WriteLine("Programm beenden!");
Console.WriteLine();
eingabe = Convert.ToInt32(Console.ReadLine());
if (eingabe == 1)
{
Console.WriteLine("Dann rechnen Sie 10 + 5"); break;
}
else if (eingabe == 2)
{
Console.WriteLine("Programm wird beendet!"); break;
}
else
{
Console.WriteLine("Sie müsseen sich für 1 oder 2 entscheiden!");
Console.WriteLine();
continue;
}
}
schleife++;
}
}
}
Wenn ich die Anweisung schleife++ unterhalb der else Anweisung einfüge (unter dem Schweif), beschwert sich der Compiler mit der Message: Unerreichbarer Code wurde entdeckt.
Bei vielen Übungsaufgaben, die ich bereits gemacht habe, war es so, dass sich die Anweisung noch innerhalb der Schleife befand.
Also:
else
{
Console.WriteLine("Sie müsseen sich für 1 oder 2 entscheiden!");
Console.WriteLine();
continue;
}
schleife++
Warum muss ich nun die Anweisung außerhalb der Schleife anwenden? 🙂
Das ist Logik, Du musst nur Deinen Code anschauen und selbst verstehen, was Du da machst.
Du hast drei Möglichkeiten wie Dein Code verläuft:
Bei allen drei Möglichkeiten hast Du entweder ein break oder ein continue, sodass Du zum while-Kopf hoch springst.
Der Code drunter kann also nie erreicht werden.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code