If Funktion

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

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

    Hallo,

    warum gibt es eigentlich die If() - Funktion?
    Sollte man die viel/wenig/garnicht Nutzen?
    Und wie unterscheidet sich ein If Block?

    Beide sind ja shortcircuited im Gegensatz zum ollen Iif().

    An sich nutze ich If() weil der Code kompakter/kürzer wird. Aber ob die Funktionalität dabei wechselt weiß ich nicht.

    Viele Grüße

    Haudruferzappeltnoch schrieb:

    warum gibt es eigentlich die If() - Funktion?
    Um Code zu vereinfachen und sich im besten Fall, einen If-Else-Block zu ersparen. Man muss aber einen Kompromiss zwischen Lesbarkeit und Kompaktheit für sich selbst finden.
    Ich nutz die Dinger sooft wie sinnvoll.

    Haudruferzappeltnoch schrieb:

    Und wie unterscheidet sich ein If Block?
    Die Frage ergibt so keinen Sinn. Aber die Funktion unterscheidet sich vom If-Else-Block dadurch, dass letzterer auch (mehrere) ElseIf-Bereiche enthalten kann und jeder Teilblock kann komplex sein. die If()-Teile müssen immer etwas zurückgeben, und das vom gleichen Typ.

    Haudruferzappeltnoch schrieb:

    Aber ob die Funktionalität dabei wechselt
    :huh: Versteh ich leider auch nicht.
    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.

    Haudruferzappeltnoch schrieb:

    Aber ob die Funktionalität dabei wechselt weiß ich nicht.
    Wie ist das zu verstehen?
    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!

    Haudruferzappeltnoch schrieb:

    Was ElseIf betrifft, man könnte dieses Ergebnis ja auch durch verschachtelte If() erzielen.
    Und: Welche Schreibweise würdest Du bevorzugen?

    VB.NET-Quellcode

    1. If a Then
    2. 'aa
    3. Else
    4. If b Then
    5. 'bb
    6. Else
    7. If c Then
    8. 'cc
    9. Else
    10. 'dd
    11. End If
    12. End If
    13. End If

    VB.NET-Quellcode

    1. If a Then
    2. 'aa
    3. ElseIf b Then
    4. 'bb
    5. ElseIf c Then
    6. 'cc
    7. Else
    8. 'dd
    9. 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!

    Haudruferzappeltnoch schrieb:

    If(a,If(b,d,e),c)
    Wie meine kleine Tochter: Ich hab doch das gemeint. ;)
    Ich hoffe, Du kannst den Ausdruck dann noch lesen und verstehen.
    Bei mehreren Codezeilen statt eines einzelnen Wertes musst Du allerdings auf den Einzeiler verzichten.
    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!

    Haudruferzappeltnoch schrieb:

    If(a,If(b,d,e),c)

    Erinnert mich an Excel-Formeln, wo alles in eine Zelle gepackt werden muss.
    Das ist geil kurz.
    Nur wenn du das nach einem halben Jahr noch verstehen willst, musst du dich erst mal wieder rein denken.
    Insbesondere wenn das nicht auf a b c d e beschränkt ist.

    Lieber lesbarer Code, als kurz auf Teufel komm raus.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Jou. Jou.
    So kurz wie nötig, nicht aber so kurz wie möglich.
    Allerdings unterscheiden sich da Anfänger und Fortgeschrittene. ;)
    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 schrieb:

    Ich hab doch das gemeint.
    Das ist bei dir ganz häufig so, man hat das Gefühl du willst es falsch verstehen.
    Es geht hier gar nicht um das Verschachteln von Ifs. Ich erinnere da auch an deine Frage von Post 4, die sich im Übrigen auch niemandem sonst gestellt hat, der hier eine Antwort zum eigentlichen Thema geliefert hat.

    Das Verschachteln kam auf weil Vapo ElseIf als Unterschied zwischen If-Funktion und If-Block aufgeführt hat.
    Hier dieses Thema nochmal in allen Aspekten gegenübergestellt:

    In der Frage "Verschachteln" geht es nur um eine philosophische Frage, ob eine If-Schachtel dasselbe ist wie ein ElseIf

    In der Frage "Lesbarkeit" geht es darum, ob jene der einzige Grund für die Existenz von If() ist. (Die Frage kann man bei dem c# Pendant ?: auch stellen)

    Worum es dir seit Post 6 geht ist, ob Verschachteln lesbar ist, was in Anbetracht der beiden Punkte dieses Themas natürlich sehr schnell verwirren kann und zudem subjektiv ist.

    Haudruferzappeltnoch schrieb:

    Ich erinnere da auch an deine Frage von Post 4, die sich im Übrigen auch niemandem sonst gestellt hat
    Da muss ich widersprechen. Das habe ich bereits in Post#2 am Ende gefragt und Dich dabei zitiert. Aber da aus meiner Sicht dazu die Frage zwischendurch beantwortet zu sein schien, hab ich nicht mehr nachgefragt.
    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.
    Das habe ich nicht als Frage verstanden, ist ja auch keine.
    Das klang eher als stelltest du dir dieselbe Frage wie ich.

    Aber gerne nochmal ausführlicher erklärt: Es gibt ja zum Beispiel bei LINQ zwei verschiedene Schreibweisen, die aber gleiche Funktionalität haben. Die Schreibweise ist also nur optischer Natur (man könnte fast Einbildung sagen).
    Ob If-Funktion und If-Block im selben Sinne nur optische Unterschiede sind, ist mir da also durch den Kopf gegangen.

    Haudruferzappeltnoch schrieb:

    Ob If-Funktion und If-Block im selben Sinne nur optische Unterschiede sind, ist mir da also durch den Kopf gegangen.
    Im Groben: Ja. Ein Beispiel:

    VB.NET-Quellcode

    1. Sub Main(args As String())
    2. Console.WriteLine("Hello World!")
    3. Dim x = 42
    4. Dim y As Integer
    5. #If 1
    6. If x > 10 Then
    7. y = 1
    8. Else
    9. y = 0
    10. End If
    11. #Else
    12. y = If(x > 10, 1, 0)
    13. #End If
    14. Console.WriteLine(y)
    15. End Sub


    Ohne Optimierungen (also Debug, nicht Release) kompiliert ergeben sich daraus die folgenden CIL-Codes (Quasi die „Maschinensprache“ der .NET-Runtime) für die verschiedenen Versionen:

    Quellcode: If-Block

    1. IL_0000: nop
    2. IL_0001: ldstr "Hello World!"
    3. IL_0006: call void [System.Console]System.Console::WriteLine(string)
    4. IL_000b: nop
    5. // Dim x = 42
    6. IL_000c: ldc.i4.s 42
    7. IL_000e: stloc.0
    8. // If x > 10 Then
    9. IL_000f: ldloc.0
    10. IL_0010: ldc.i4.s 10
    11. IL_0012: cgt
    12. IL_0014: stloc.2
    13. IL_0015: ldloc.2
    14. IL_0016: brfalse.s IL_001d // Spinge zu IL_001d wenn kleiner
    15. // y = 1
    16. IL_0018: ldc.i4.1
    17. IL_0019: stloc.1
    18. IL_001a: nop
    19. IL_001b: br.s IL_0021 // Springe zu IL_0021 (d.h. überspringe den Else-Zweig)
    20. // y = 0
    21. IL_001d: nop
    22. IL_001e: ldc.i4.0
    23. IL_001f: stloc.1
    24. IL_0020: nop
    25. // Console.WriteLine(y)
    26. IL_0021: ldloc.1
    27. IL_0022: call void [System.Console]System.Console::WriteLine(int32)
    28. IL_0027: nop
    29. IL_0028: ret

    Quellcode: If-Function

    1. IL_0000: nop
    2. IL_0001: ldstr "Hello World!"
    3. IL_0006: call void [System.Console]System.Console::WriteLine(string)
    4. IL_000b: nop
    5. // Dim x = 42
    6. IL_000c: ldc.i4.s 42
    7. IL_000e: stloc.0
    8. // If(x > 10, …
    9. IL_000f: ldloc.0
    10. IL_0010: ldc.i4.s 10
    11. IL_0012: bgt.s IL_0017 // Springe zu IL_0017 wenn größer
    12. // If(…, …, 0); False-Wert der If-Function
    13. IL_0014: ldc.i4.0
    14. IL_0015: br.s IL_0018 // Springe zu IL_0018
    15. // If(…, 1, …); True-Wert der If-Function
    16. IL_0017: ldc.i4.1
    17. // y = If(…); Wert zuweisen
    18. IL_0018: stloc.1
    19. // Console.WriteLine(y)
    20. IL_0019: ldloc.1
    21. IL_001a: call void [System.Console]System.Console::WriteLine(int32)
    22. IL_001f: nop
    23. IL_0020: ret



    Der Unterschied liegt im Wesentlichen nur darin, wie der Vergleich und der Branch (In CIL wird das per goto realisiert) durchgeführt wird.
    Mit dem If-Block wird verglichen (IL_0012: cgt, „Compare greater than“) und dann verzweigt (IL_0016: brfalse.s IL_001d, „Branch if false“), für die If-Function wird in diesem Beispiel Vergleich und Verzweigung mit einer Instruktion durchgeführt (IL_0012: bgt.s IL_0017, „Branch if greater than“). Es wird also kein tatsächlicher Funktionsaufruf stattfinden, sondern das Verhalten ist identisch zu ternären Ausdrücken in C-artigen Sprachen (x ? y : z).

    Um Missverständnisse zu vermeiden: In diesem Beispiel scheint der CIL-Code für die If-Function mit etwas weniger Instruktionen auszukommen. Das bedeutet aber nicht, dass man „für Performance“ lieber die If-Function einsetzt. Es gelten, wie immer, die Regeln der Optimierung nach Michael A. Jackson (nein, nicht der Musiker):
    1. Don't do it.
    2. (for experts only): Don't do it yet.
    Mit freundlichen Grüßen,
    Thunderbolt