Do While (1 = 1)

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 38 Antworten in diesem Thema. Der letzte Beitrag () ist von EaranMaleasi.

    Do While (1 = 1)

    Hi,

    heute habe ich eine ganz einfache Frage:

    Ich möchte eine Schleife kodieren, die nicht von selbst abbricht. Natürlich muss ich die Schleife dann "handgesteuert" beenden, damit ich einen "tight loop" vermeide. So mache ich das:

    VB.NET-Quellcode

    1. Do While (1 = 1)
    2. If blnExpose Then Exit Do
    3. ...
    4. Loop


    Das Ganze funktioniert zwar. Aber die Sache mit dem "1 = 1" scheint mir ein bissl hausbacken zu sein. Andere Programmiersprachen kennen dafür eigene Konstrukte, wie "Do forever" oder "Do loop" etc. Diese Syntax ist in VB aber nicht implementiert.

    Wie macht man das denn in VB.Net am geschicktesten? Oder ist mein Coding in Ordnung ?

    LG
    Peter

    VB.NET-Quellcode

    1. While True
    2. End While


    Kurz zur Erklärung: While wiederholt den Code in der Schleife so lange, bis der Ausdruck nach While (also While [Ausdruck]) False ist. Weil True konstant ist und niemals False sein wird, ist das eine Unendlichkeitsschleife. Du könntest genauso gut While 1 = 1 oder While Not False oder While 0 > 1 schreiben,
    Mfg
    Vincent

    VB.NET-Quellcode

    1. Option Strict Off
    2. Public Class Form1
    3. Dim blnExpose As Boolean = False
    4. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    5. Do
    6. If blnExpose Then Exit Do
    7. Loop
    8. End Sub
    9. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    10. blnExpose = True
    11. End Sub
    12. End Class


    Hilft dir dieser Code?

    edit:
    Code verbessert!
    Visual Basic.NET 8o
    MS-SQL
    8o

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Cheffboss“ ()

    Peter329 schrieb:

    die nicht von selbst abbricht.
    Das wäre z.B. eine Threadprozedur, wo Du den Thread genau so am Leben hältst.
    Dort musst Du eine solche Schleife ordentlicherweise beendbar machen, damit Du den Thread jederzeit beenden kannst.
    Mit anderen Variablen kannst Du steuern, ob und wenn ja was der Thread machen soll.
    Einen Thread mit Abort() zu beenden wäre dann die Holzhammermethode.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich weiß nicht, warum hier alle nochmal ne zusätzliche Hilfsvariable machen, oder eine Endlosschleife, die dann abgebrochen wird, aber so dürfte es mMn am schönsten sein

    VB.NET-Quellcode

    1. While (Not blnExpose)
    2. End While
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---

    EaranMaleasi schrieb:

    wo ... her
    Das wird in einem anderen Thread, z.B. im Hauptfenster, gesetzt.
    @jvbsl Nicht unbedingt.
    Wenn in so einer Schleife mehrere langwierige Dinge abgearbeitet werden, ist es sinnvoll, die Abbruchbedingung auch zwischendurch abzufragen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @EaranMaleasi
    Dim Run as Boolean = True
    Do While(Run)
    If ArbeitBeendet Then Run = False

    Ich sehe da zwei Variablen, wobei eine ganz sicher reicht.
    @RodFromGermany das ist richtig, trotzdem sollte man solche Endlosschleifen vermeiden. Man kann die Abbruchbedingung ja für solche Fälle immernoch zusätzlich machen ;)
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    Code

    Cheffboss schrieb:


    VB.NET-Quellcode

    1. Option Strict Off
    2. Public Class Form1
    3. Dim blnExpose As Boolean = False
    4. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    5. Do
    6. If blnExpose Then Exit Do
    7. Loop
    8. End Sub
    9. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    10. blnExpose = True
    11. End Sub
    12. End Class


    Hilft dir dieser Code?

    edit:
    Code verbessert!




    Der Code is sowieso - aus 2 Gründen - Grütze...einmal weils, wie VincentTB gesagt hat mit Option Strict Off is und zweitens, weil sich durch die Schleife, die mit Button1 ausgelöst wird, auf dem Main- bzw GUI-Thread liegt und du deshalb dir den ganzen Prozess aufhängst => Keine Rückmeldung...
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
    Wie kann es sein, dass hier so viele unterschiedliche Meinungen daherkommen? Es ist eine simple Endlosschleife O_o

    VB.NET-Quellcode

    1. Do
    2. Loop
    Mehr ist da nicht.
    Bedingte Schleifen sind in VB immer so aufgebaut.
    Andere Varianten sind diese:

    VB.NET-Quellcode

    1. 'Kopfgesteuert
    2. Do While Bedingung
    3. Loop
    4. Do Until Bedingung
    5. Loop
    6. 'Fußgesteuert
    7. Do
    8. Loop While Bedingung
    9. Do
    10. Loop Until Bedingung


    Als alternative Syntax für die kopfgesteuerte While-Schleife gibt es bei VB noch

    VB.NET-Quellcode

    1. While Bedingung
    2. End While
    , was ich aber aus Konsistenzgründen nicht empfehlen kann, denn es gibt keine Until-Variante und keine fußgesteuerten Varianten davon.

    Interessant auch:

    VB.NET-Quellcode

    1. While Bedingung
    2. Wend 'Compiler-Fehler: Wend-Anweisungen werden nicht mehr unterstützt. Verwenden Sie stattdessen "End While"-Anweisungen.


    Mir ist klar, dass die Klammer bei Do While (True) eine Gewohnheitssache ist, die von C# kommt. Die Klammer ist aber unnötig und meiner Meinung nach auch störend für den Lesefluss.
    Wie vom TE schon angemerkt, ist Do While (1 = 1) noch komischer. Nicht nur, dass die Klammer nicht benötigt wird, aber es ist von vorn herein klar, dass 1 immer gleich 1 ist, also wäre das True-Literal angebrachter (und deshalb automatisch eine bedingungslose Do-Loop-Schleife). Und der Compiler generiert suboptimalen Code (wenn Optimierungen deaktiviert sind).

    VB.NET-Quellcode

    1. While (Not blnExpose)
    2. End While
    Genau dafür gibt es Until: Do Until blnExpose
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils
    Oh jemineh, was hab ich da nur angerichtet! :)

    Also, ihr Lieben, die Sache mit "blnExpose" hab ich doch nur als Code Beispiel verwendet (weil die Variable gerade in meinem realen Coding so rum schwirrte).

    Ich hätte vielleicht besser folgendes einstellen sollen:

    VB.NET-Quellcode

    1. Do While (1 = 1)
    2. ... irgendwelches Coding
    3. If ... irgendeine Abbruchbedingung ... Then Exit Do
    4. ... irgendwelches Coding
    5. Loop


    Man muss halt hier im Forum höllisch aufpassen, dass man nicht missverstanden werden kann. Sonst kriegt man am Ende noch erklärt, wie ein "Do While" funktioniert! :)

    Aber meine Frage ist ja beantwortet. Es gibt in VB.Net keine Syntax, die "Do Forever" oder "Do Loop" entspricht. Statt "Do While (1 = 1)" ist vielleicht

    Do While (True)

    dann die Formulierung, die der Sache am nächsten kommt! Aber so wie ich das sehe, ist das wohl reine Geschmackssache.

    Oder man nimmt ganz einfach

    Do
    ...
    Loop

    wie Niko Ortner geschrieben hat. [edit: und White Page]

    Wie immer ergeht mein Dank an alle Ratgeber. Ich will diesmal vom "Daumen hoch" absehen, da ich nicht zu einer inflationären Abwertung der "hilfreich" Bewertung" beitragen möchte. :) Aber es sei schon angemerkt, dass ich es toll finde, dass ihr euch so für die Sprache VB engagiert.

    LG
    Peter

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „Peter329“ ()

    @jvbsl
    und möchtest dann "Until" verwenden
    Ja.
    ...
    Mir ging es um die Konsistenz zu den anderen Schleifen in VB ;)

    Davon abgesehen: Ich finde Do Until Bucket.IsEmpty wesentlich besser lesbar, als Do While Not Bucket.IsEmpty.
    Ich kann auch nicht ganz nachvollziehen, warum es in C-ähnlichen Sprachen kein Until gibt.

    C#-Quellcode

    1. until (Bedingung) { ... }
    2. do { ... } until (Bedingung);
    Sieht für mich legitim aus.
    Aber die Antwort wird wahrscheinlich lauten:

    Eric Lippert schrieb:

    Nobody took the time to design, implement, test and document the feature.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Niko Ortner“ ()