Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Wann muss ich genau einen Anweisungsblock anwenden?
nytrec
myCSharp.de - Member



Dabei seit:
Beiträge: 37

Themenstarter:

Wann muss ich genau einen Anweisungsblock anwenden?

beantworten | zitieren | melden

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? ?(
private Nachricht | Beiträge des Benutzers
nytrec
myCSharp.de - Member



Dabei seit:
Beiträge: 37

Themenstarter:

beantworten | zitieren | melden

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?^^
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15704
Herkunft: BW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
nytrec
myCSharp.de - Member



Dabei seit:
Beiträge: 37

Themenstarter:

beantworten | zitieren | melden

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.

private Nachricht | Beiträge des Benutzers
MarsStein
myCSharp.de - Experte

Avatar #avatar-3191.gif


Dabei seit:
Beiträge: 3429
Herkunft: Trier -> München

beantworten | zitieren | melden

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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von MarsStein am .
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15704
Herkunft: BW

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
nytrec
myCSharp.de - Member



Dabei seit:
Beiträge: 37

Themenstarter:

beantworten | zitieren | melden

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?
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von nytrec am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15704
Herkunft: BW

beantworten | zitieren | melden

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:
1) eingabe == 1
2) eingabe == 2
3) alles andere

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.
private Nachricht | Beiträge des Benutzers
nytrec
myCSharp.de - Member



Dabei seit:
Beiträge: 37

Themenstarter:

beantworten | zitieren | melden

Jopp, verstanden. Thx
private Nachricht | Beiträge des Benutzers