Sub als Parameter übergeben

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

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von SidezockingLP.

    Sub als Parameter übergeben

    Hey zusammen,

    ich habe mal wieder eine Frage: Ist es möglich einen Sub als Parameter an einen anderen zu übergeben, bzw. gibt es einen Datentyp dafür? Also sowas wie hier:

    VB.NET-Quellcode

    1. Private Sub Start()
    2. Sub_Starter(testsub)
    3. End Sub
    4. Private Async Sub Sub_Starter(Zu_Startender_Sub As Sub)
    5. Await System.Threading.Tasks.Task.Run(Sub() Zu_Startender_Sub())
    6. End Sub


    Wäre Super wenn jemand eine Antwort wüsste, im Internet habe ich nämlich nur Beiträge gefunden wie man einen Sub mit Parametern erstellt :)
    Der Typ in Methoden, die als async markiert sind, ist in der Regel Task, nicht Sub. Außer es handelt sich um Eventhandler, was hier aber wohl nicht so ist. Außerdem kannst Du den Task direkt zurückgeben, wenn du nichts weiteres ausführst und dann erst die aufrufende Methode awaiten lassen. Also nur Return Task.Run(...).
    Somit könnte hier das async await eigentlich weg, wenn Du da nicht explizit awaiten musst. Wenn es ein Task ist, dann ist der nämlich sowieso wieder awaitable. Und wenn Du den Aufruf nicht awaitest, dann wird das eigentlich synchron ausgeführt. Ich glaub nicht, dass das Ziel ist. Also da aufpassen.
    Ansonsten suchst Du Delegaten. Schau Dir mal Action<T>, Func<TIn, TOut>, Lambdaausdrücke usw. an.

    Grüße
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Hey @Trade

    Stimmt das await in meinem Beispiel ist sinnlos.
    Ich glaube ich habe nicht wirklich herübergebracht was mein Problem ist. Ich habe jetzt mal mein Problem so ungefähr nachgestellt:

    VB.NET-Quellcode

    1. Private Sub Sub_Aufrufer()
    2. Code_Starter(Sub() Mach_iwas())
    3. End Sub
    4. Private Sub Code_Starter(Sub_to_start As [Delegate])
    5. AddHandler TextBox1.TextChanged, Sub()
    6. Mach_erst_iwas(mitdemcode)
    7. Sub_to_start() 'Wie schaffe ich es das aufzurufen?? :)
    8. Mach_noch_iwas(mitdemcode)
    9. End Sub
    10. End Sub

    Ich möchte also statt wie bei dieser verständlichen Prozedur(unten) auch noch zusätzlichen Code im Event Handler ausführen:

    VB.NET-Quellcode

    1. Private Sub Sub_Aufrufer()
    2. Code_Starter(Sub() Mach_iwas())
    3. End Sub
    4. Private Sub Code_Starter(Sub_to_start As [Delegate])
    5. AddHandler TextBox1.TextChanged, Sub_to_start 'Also hier noch anderen Code ausführen
    6. End Sub


    Und ich möchte den zusätzlichen Code auch nicht im 'Aufruf' Sub schreiben so wie das:

    VB.NET-Quellcode

    1. Private Sub Sub_Aufrufer()
    2. Code_Starter(Sub()
    3. Mach_erst_iwas(mitdemcode)
    4. mach_iwas()
    5. Mach_noch_iwas(mitdemcode)
    6. End Sub)
    7. End Sub
    8. Private Sub Code_Starter(Sub_to_start As [Delegate])
    9. AddHandler TextBox1.TextChanged, Sub_to_start
    10. End Sub


    Hoffe ihr versteht jetzt was ich meine. :) MFG

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

    @SidezockingLP Meinst Du so was:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Delegate Sub Test(sender As Object, e As EventArgs)
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Code_Starter(AddressOf TextBox1_TextChanged)
    5. End Sub
    6. Private Sub Code_Starter(Sub_to_start As Test)
    7. AddHandler TextBox1.TextChanged, Sub()
    8. Mach_erst_iwas()
    9. Sub_to_start(Nothing, EventArgs.Empty) 'Wie schaffe ich es das aufzurufen?? :)
    10. Mach_noch_iwas()
    11. End Sub
    12. End Sub
    13. Private Sub Mach_erst_iwas()
    14. ListBox1.Items.Add("Mach_erst_iwas")
    15. End Sub
    16. Private Sub Mach_noch_iwas()
    17. ListBox1.Items.Add("Mach_noch_iwas")
    18. End Sub
    19. Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs)
    20. ' das ist der eigentliche Eventhandler
    21. ListBox1.Items.Add("=> " & TextBox1.Text)
    22. End Sub
    23. Private Sub Sub_to_start()
    24. ListBox1.Items.Add("Sub_to_start")
    25. End Sub
    26. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    27. ListBox1.Items.Clear()
    28. End Sub
    29. End Class
    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!