Unterschied zwischen Function und Sub bei Vb.net

  • VB.NET

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

    Unterschied zwischen Function und Sub bei Vb.net

    Hallo,

    stehe gerade vor der obigen Frage. Ich weiß, dass diese tausendfach im
    Internet beantwortet wird mit "Eine Funktion hat einen Rückggabewert".

    Ich habe mir beides genauer angeschaut und ich verstehe nicht genau, warum
    eine Sub keinen Rückgabewert hat. Schließlich ist hiermit eine Referenzierung
    ebenso möglich.
    Folgendes Codebeispiel hierzu:

    Quellcode

    1. Public Sub Name()
    2. Dim Ganzzahl As Integer = 15
    3. NSub(Ganzzahl)
    4. MessageBox.Show(Ganzzahl)
    5. End Sub
    6. Sub NSub(ByRef x As Integer)
    7. x = x * 10
    8. End Sub
    9. 'Wert 150 wird ausgegeben.
    10. End Class



    Quellcode

    1. Public Sub Name()
    2. Dim Ganzzahl02 As Integer = 15
    3. Funktion(Ganzzahl02)
    4. MessageBox.Show(Ganzzahl02)
    5. End Sub
    6. Function Funktion(ByRef y As Integer)
    7. y = y * 10
    8. Return y
    9. End Function
    10. 'Wert 150 wird ausgegeben.
    11. End Class


    Ich stehe halt einfach vor der Frage nach dem Verwendungszweck.
    Danke im voraus!
    Gegenfrage: Was ist lesbarer? Als Function:

    VB.NET-Quellcode

    1. If TextIsNothingOrEmpty(MyText) Then StartAlert
    oder als Sub mit ByRef:

    VB.NET-Quellcode

    1. Dim IsNothingOrEmpty As Boolean = False
    2. CheckText(MyText, IsNothingOrEmpty)
    3. If IsNothingOrEmpty Then StartAlert

    (Ein Hinweis auf String.IsNullOrEmpty ist überflüssig. ;) )
    ByRef sollte m.E. nur selten verwendet werden, da ggf. der User nicht weiß, dass die Daten verändert werden. Streckenweise ist das nämlich kontrainstinktiv. Klar könntest Du Ne Function durch ne Sub mit ByRef-Parameter ersetzen. Aber es macht das ganze komplizierter. Nicht nur wegen des zusätzlichen Parameters, den man jedes mal vorher deklarieren und mitgeben müsste.
    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.

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

    Guten Abend Hourmin

    Mach mal

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On


    Man wird dann feststellen, dass die Funktion angefehlert wird.
    Eine Funktion besitzt einen Rückgabewert, nebst der Parameterübergabe. Darum könnte das irgendwie so heissen

    VB.NET-Quellcode

    1. Function Mult(ByVal y As Integer) As Integer
    2. Return y * 10
    3. End Function


    Eine Sub besitzt keinen Rückgabewert. Nur die Parameterliste.

    VB.NET-Quellcode

    1. Sub Invers(ByRef y As Integer)
    2. y = -y
    3. End Sub


    Freundliche Grüsse

    exc-jdbi
    @Hourmin Vielleicht noch ein Nachtrag zur Syntax in VB:
    Du hast zwei Möglichkeiten, den Return-Wertzu übergeben.
    Einmal als Return xxx und einmal als NAME_DER_FUNKTION = xxx, wobei der gute Stil die zweite Möglichkeit auslässt.
    1. VB.NET-Quellcode

      1. Function Mult(ByVal y As Integer) As Integer
      2. Return y * 10
      3. End Function

    2. VB.NET-Quellcode

      1. Function Mult(ByVal y As Integer) As Integer
      2. Mult = y * 10
      3. End Function

    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:

    1. VB.NET-Quellcode

      1. Function Mult(ByVal y As Integer) As Integer
      2. Mult = y * 10
      3. End Function



    Ohne Return wird allerdings Code der nachdem "Mult = y * 10" kommt trotzdem noch ausgeführt und das will man ja in machen fällen nicht

    VB.NET-Quellcode

    1. Function Mult(ByVal y As Integer) As Integer
    2. Mult = y * 10
    3. MessageBox.Show("test")
    4. End Function


    Hier würde er trotzdem noch die Messagebox zeigen, mit einem Return nicht. Ist vielleicht eigentlich allen klar aber manch einer weiß das nicht.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    xChRoNiKx schrieb:

    und das will man ja in machen fällen nicht
    Genau das ist es, was der EDR hier meint:

    ErfinderDesRades schrieb:

    hmm - es gibt Fälle, wo dieses Feature Code vereinfachen kann
    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!