Select Case nur kosmetisch?

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

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Select Case nur kosmetisch?

    Hallo,

    ich weiß man kann Select Case auch durch ein If... ElseIf... rekreieren, aber ich dachte es wären dennoch verschiedene "Operationen"

    Jetzt habe ich beim Herumprobieren mit einem Dekompilierer an einer Stelle festgestellt, dass statt einem Select Case, wie ich in der sln nachschlage, in ein If ElseIf übersetzt wird.

    Heißt das Select Case ist nur eine andere Schreibweise von If? Quasi wie bei x as New xClass und x = New xClass
    Oder stimmen die Version der .exe und der .sln einfach nicht überein?

    Viele Grüße
    Das dürfte eine Suppe sein. Select Case ist AFAIK eine Spezialform eines If-Blocks, welche aber so nicht in der prozessornahen Sprache existiert. Man Ich könnte sagen: Select Case ist syntactic sugar.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Das dürfte eine Suppe sein.
    Zumindest nicht ganz in C# nicht und ich glaube auch nicht in VB.

    If vs. Switch Speed


    The compiler can build jump tables where applicable. For example, when you use the reflector to look at the code produced, you will see that for huge switches on strings, the compiler will actually generate code that uses a hash table to dispatch these.

    Die Sache ist hier bei das ​where applicable. Bei einem Switch-Statement könnte der Compiler das also optimieren, wenn er das für angebracht hält. War bei dem Beispiel von Haudruferzappeltnoch nur einfach nicht der Fall.
    Moinsen,

    der Unterschied war, meine ich mich zu erinnern, daß bei "Select Case" nach einer positiven Bedingung die Struktur verlassen wird, bei "ElseIf" aber unter bestimmten Umständen noch weitere Bedingungen ausgewertet werden.

    Allerdings muß ich zugeben, daß ich ElseIf sogut wie garnicht verwende.

    Viele Grüße

    Gerrit

    Gerrit schrieb:

    unter bestimmten Umständen noch weitere Bedingungen ausgewertet werden
    Welche müssen das sein? Das ist bei mir noch nie passiert.
    Dass das Verhalten gleich ist war mir schon länger geläufig und daher hätte ich da Zweifel.

    Aber wie es sich im Compiler verhält ist natürlich eine ganz andere Geschichte. Da gilt viele Wege führen nach Rom

    Haudruferzappeltnoch schrieb:

    Welche müssen das sein? Das ist bei mir noch nie passiert.
    Beispiel:

    VB.NET-Quellcode

    1. Dim value = 5
    2. If value = 1 Then
    3. MessageBox.Show("1")
    4. Else If value = 2 Then
    5. MessageBox.Show("2")
    6. Else If value = 3 Then
    7. MessageBox.Show("3")
    8. Else If value = 4 Then
    9. MessageBox.Show("4")
    10. Else
    11. MessageBox.Show("sonst")
    12. End If
    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!
    Habe da mal eine Frage zu:

    VB.NET-Quellcode

    1. Dim value = 5
    2. If value = 1 OR value = 5 Then ' <=====Das geht doch NICHT mit Select Case oder?
    3. MessageBox.Show("1")
    4. Else If value = 2 Then
    5. MessageBox.Show("2")
    6. Else If value = 3 Then
    7. MessageBox.Show("3")
    8. Else If value = 4 Then
    9. MessageBox.Show("4")
    10. Else
    11. MessageBox.Show("sonst")
    12. End If
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:

    Gerrit schrieb:

    der Unterschied war, meine ich mich zu erinnern, daß bei "Select Case" nach einer positiven Bedingung die Struktur verlassen wird, bei "ElseIf" aber unter bestimmten Umständen noch weitere Bedingungen ausgewertet werden.

    Ich glaube nicht, nein. Das sollte beides gleich sein.

    @RodFromGermany Ouh, da hast du aber gepennt oder? Die Frage war, dass nach einem positivem Case noch weiter gemacht wird. Dein If hat nur negative und springt dann ins else, genau wie das switch es macht.

    @Amelie Doch, hier das Beispiel von MSDN:

    VB.NET-Quellcode

    1. Dim number As Integer = 8
    2. Select Case number
    3. Case 1 To 5
    4. Debug.WriteLine("Between 1 and 5, inclusive")
    5. ' The following is the only Case clause that evaluates to True.
    6. Case 6, 7, 8
    7. Debug.WriteLine("Between 6 and 8, inclusive")
    8. Case 9 To 10
    9. Debug.WriteLine("Equal to 9 or 10")
    10. Case Else
    11. Debug.WriteLine("Not between 1 and 10, inclusive")
    12. End Select


    //Edit: Ouh, da war petaod noch schneller.

    Bluespide schrieb:

    Ouh, da hast du aber gepennt oder?
    Nö.
    Zu Case habe ich mich nicht geäußert.
    OK, die Formuliedrung ist nicht eineindeutig.
    ====

    Amelie schrieb:

    Habe da mal eine Frage zu:
    Kann es sein, dass Du nicht in der Lage bist, in den Microsedt Docs Deine Antworten zu finden und immer gleich das Forum befragst?
    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!
    @RodFromGermany aus Post 6
    Naja ich schätze so kann man das auch verstehen, dass Else eine weitere Bedingung ist, die nach den ElseIf ausgewertet wird, wenn kein ElseIf getroffen hat

    Ich meinte Bedingungen, die zu mehr als einem Resultat in einer If-Abfrage führen. Das sollte es doch nicht geben, jedenfalls habe ich das bisher so verinnerlicht. End If wird nach Treffer immer angesteuert.

    Haudruferzappeltnoch schrieb:

    Ich meinte Bedingungen, die zu mehr als einem Resultat in einer If-Abfrage führen.
    Meinst Du mehrere mögliche positive Fälle?

    VB.NET-Quellcode

    1. Dim value = 5
    2. If value = 1 Then
    3. MessageBox.Show("1")
    4. ElseIf value <= 5 Then
    5. MessageBox.Show("5 (1)")
    6. ElseIf value >= 5 Then
    7. MessageBox.Show("5 (2)")
    8. Else
    9. MessageBox.Show("sonst")
    10. End If
    Nach dem ersten Treffer geht er raus, es kommt also immer genau eine MsgBox.
    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!
    @RodFromGermany
    ​Kann es sein, dass Du nicht in der Lage bist, in den Microsedt Docs


    Doch das kann ich schon NUR oft ist das dort so blöd beschrieben, das ich es nicht verstehe, und dann frage ich eben im Forum.
    Asperger Autistin. Brauche immer etwas um gewisse Sachen zu verstehen. :huh:
    Hier mal ein Auszug aus einem anderen Forum:
    Hallo,

    wie du oben schon selbst schreibst, sind 53 if-else Verschachtelungen
    nicht gerade leserlich.

    Der wesendliche Unterschied zwischen if-else und switch-case ist, daß
    man bei if-else Konstrukten beliebige boolsche Ausdrücke prüfen kann,
    bei switch-case wird immer nur die Variable im SWITCH mit exakt dem Wert
    von CASE verglichen. Konstrukte wie z.B. if ((var > 10) && (var <20))
    sind als switch-case eher umständlicher (Stichwort Fall-Through).

    Der Vorteil von switch-case ist, daß der Compiler den Code viel besser
    optimieren kann wie das bei einzelnen if-else Statements möglich ist.
    Der Grund dafür ist, daß er ja weiß, daß immer die selbe Variable
    geprüft wird, und daß der Vergeich immer mit einem eindeutigen
    konstanten Wert erfoglt und nicht von anderen Bedinungen abhängt.

    Der Compiler kann bei größeren switch-case Konstrukten optimieren, indem
    er das ganze als indizierte Sprungtabelle implementieren kann. Das geht
    bei if-else Anweisungen nicht.

    Unter den genannten Gesichtspunkten (Code-Übersichtlichkeit,
    Compiler-Optimierung) würde ich für deinen Fall das switch-case
    Konstrukt bevorzugen.


    Ich nutz z.B. Beides gemischt - soweit wie ich das einschätze, kann ich z.B. STRG+C nicht mit einem Select Case prüfen, daher dort ElseIf und die
    einfachen KeyCodes wieder mit Select Case. Ansonsten nutz' ich Select Case gerne, sieht auch aufgeräumter aus ;)

    VB.NET-Quellcode

    1. Private Sub dgv_KeyDown(sender As Object, e As KeyEventArgs) Handles dgv.KeyDown
    2. If e.KeyCode = Keys.P AndAlso e.Modifiers = Keys.Control Then
    3. 'Print
    4. ElseIf e.KeyCode = Keys.C AndAlso e.Modifiers = Keys.Control Then
    5. dgv.copyExportSelection(False)
    6. ElseIf e.KeyCode = Keys.A AndAlso e.Modifiers = Keys.Control Then
    7. dgv.SelectAll()
    8. ElseIf e.KeyCode = Keys.I AndAlso e.Modifiers = Keys.Control Then
    9. dgv.infoDGV
    10. End If
    11. Select Case e.KeyCode
    12. Case Keys.Enter : Edit()
    13. Case Keys.Insert : createNew()
    14. Case Keys.Delete : If User.MayDelete(AppMod.Standort) Then dgv.dgv_Delete(e) Else dgv.dgv_DeleteDenied(e)
    15. End Select
    16. End Sub

    "Na, wie ist das Wetter bei dir?"
    "Caps Lock."
    "Hä?"
    "Shift ohne Ende!" :thumbsup:
    Geht auch so mit Select Case True:

    VB.NET-Quellcode

    1. Private Sub dgv_KeyDown(sender As Object, e As KeyEventArgs) Handles dgv.KeyDown
    2. Select Case True
    3. Case e.KeyCode = Keys.P AndAlso e.Modifiers = Keys.Control : Print
    4. Case e.KeyCode = Keys.C AndAlso e.Modifiers = Keys.Control : dgv.copyExportSelection(False)
    5. Case e.KeyCode = Keys.A AndAlso e.Modifiers = Keys.Control : dgv.SelectAll()
    6. Case e.KeyCode = Keys.I AndAlso e.Modifiers = Keys.Control : dgv.infoDGV
    7. Case Keys.Enter = e.KeyCode : Edit()
    8. Case Keys.Insert = e.KeyCode : createNew()
    9. Case Keys.Delete = e.KeyCode
    10. If User.MayDelete(AppMod.Standort) Then
    11. dgv.dgv_Delete(e)
    12. Else
    13. dgv.dgv_DeleteDenied(e)
    14. End If
    15. End Select
    16. End Sub

    Amelie schrieb:

    Doch das kann ich schon NUR oft ist das dort so blöd beschrieben,
    Dann bringe das bei Deinen Fragen auch zum Ausdruck.
    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!