Zuweisen von Public Sub als ByVal einer 2. Sub

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von ~blaze~.

    Zuweisen von Public Sub als ByVal einer 2. Sub

    Hallo zusammen,

    ich hab da eine Frage zu der ich bisher noch keine Lösung finden konnte.

    Ich versuche zur Zeit einige Subs auf ihre Geschwindigkeit ( Ausführdauer) zu Testen.
    Nun bin ich notorisch eher faul. Ich teste die Ausführdauer so:

    VB.NET-Quellcode

    1. Private Sub AktuellToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AktuellToolStripMenuItem.Click
    2. Startzeit = System.DateTime.Now
    3. _NeueForm.Erstellen("Aktuell")
    4. Debug.Print((System.DateTime.Now.Subtract(Startzeit).TotalMilliseconds).ToString)
    5. End Sub


    Meine Frage ist jetzt:

    Kann ich einer Sub eine Andere Sub als ByVal mitgeben?
    Dann könnte ich in der Sub meine Startzeit festlegen usw.

    Im Code sähe das dann so aus:

    VB.NET-Quellcode

    1. Private Sub AktuellToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AktuellToolStripMenuItem.Click
    2. DebugZeit(_NeueForm.Erstellen("Aktuell")) 'Hier wird der Sub DebugZeit die Sub _NeueFormErstellen(byVals) zugewiesen
    3. End Sub
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Danke erst mal.
    Leider schaffe ich es heute nicht mehr mich mit den Delegates genau zu befassen. Aber ich werde das morgen tun und dann rückmelden ob es das war was ich wollte.

    @VincentTB das Beispiel von stack arbeitet mit functionen. Zeigt aber prinzipiel das was ich suchte. Ich muss mir das morgen nochmal in ruhe durchlesen wie ich das auf Subs umbauen kann.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Zum Messen einer Dauer stellt das Framework eine StopWatch bereit.
    Sofern Dein PC einen Multimedia-Timer hat (und den hat es), ist StopWatch genauer als die DateTime-Differenz.

    VB.NET-Quellcode

    1. Dim sw As New Stopwatch
    2. sw.Start()
    3. ' das auszumessende
    4. sw.Stop()
    5. 'MessageBox.Show(sw.Elapsed.ToString)
    6. MessageBox.Show(sw.ElapsedMilliseconds.ToString)
    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!
    Guten Morgen!

    Danke für den Tip
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Hi
    du kannst für sowas auch ein kleines Programm schreiben, das für dich testet. Hab' mal schnell ein kleines zusammengeschrieben:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public MustInherit Class Testing
    2. Private Sub New()
    3. End Sub
    4. Friend Shared Sub Test()
    5. Test(GetType(Testing), True)
    6. End Sub
    7. Public Shared Sub Test(ByVal type As Type, ByVal includeNonPublic As Boolean)
    8. 'Alle Methoden, die mit einem TestAttribute-Attribut versehen wurden zum PerformTest durchreichen
    9. For Each m As MethodInfo In type.GetMethods(BindingFlags.Public Or BindingFlags.Static Or If(includeNonPublic, BindingFlags.NonPublic, BindingFlags.Default))
    10. Dim tatt() As TestAttribute = DirectCast(m.GetCustomAttributes(GetType(TestAttribute), True), TestAttribute())
    11. If tatt.Length = 1 Then
    12. If tatt(0).Enabled Then PerformTest(DirectCast([Delegate].CreateDelegate(GetType(Action), m), Action), m, tatt(0))
    13. End If
    14. Next
    15. End Sub
    16. Private Shared Sub PerformTest(ByVal method As Action, ByVal info As MethodInfo, ByVal attribute As TestAttribute)
    17. Dim result As New System.Text.StringBuilder()
    18. Dim tests As Integer = 0
    19. 'Ausgabe erzeugen
    20. result.Append(info.Name)
    21. If attribute.Technique IsNot Nothing Then
    22. result.Append(" (""").Append(attribute.Technique).Append(""")")
    23. End If
    24. result.Append(":"c).AppendLine()
    25. Dim prf() As PerformanceTestAttribute = DirectCast(info.GetCustomAttributes(GetType(PerformanceTestAttribute), False), PerformanceTestAttribute())
    26. If prf.Length = 1 Then 'Wenn Performancetests durchgefuehrt werden sollen
    27. Dim t As Integer = prf(0).Milliseconds
    28. Dim it = MeasureIterations(method, t)
    29. result.Append("Number of iterations in " & prf(0).Milliseconds & "ms: ")
    30. result.Append(it).Append(" (~").Append((TimeSpan.TicksPerMillisecond * t / it).ToString("0.0000")).Append(" ticks/iteration)").AppendLine()
    31. tests += 1 'Anzahl der Tests inkrementieren (==> polymorphe Gestaltung des Testings ist nat. wesentlich schoener)
    32. End If
    33. If tests = 0 Then
    34. method()
    35. End If
    36. result.Append("-"c, 16).AppendLine()
    37. System.Diagnostics.Debug.Print(result.ToString())
    38. End Sub
    39. Private Shared Function MeasureIterations(ByVal method As Action, ByVal milliseconds As Integer) As Long
    40. Dim sw As Stopwatch = Stopwatch.StartNew()
    41. Dim iterations As Long = 0
    42. While sw.ElapsedMilliseconds < milliseconds
    43. method()
    44. iterations += 1
    45. End While
    46. Return iterations
    47. End Function
    48. End Class
    49. <AttributeUsage(AttributeTargets.Method, AllowMultiple:=False, Inherited:=False)> _
    50. Public Class TestAttribute
    51. Inherits Attribute
    52. Private _enabled As Boolean
    53. Private _technique As String
    54. Public Sub New()
    55. Me.New(Nothing, True)
    56. End Sub
    57. Public Sub New(ByVal enabled As Boolean)
    58. Me.New(Nothing, enabled)
    59. End Sub
    60. Public Sub New(ByVal technique As String)
    61. Me.New(technique, True)
    62. End Sub
    63. Public Sub New(ByVal technique As String, ByVal enabled As Boolean)
    64. _technique = technique
    65. _enabled = enabled
    66. End Sub
    67. Public ReadOnly Property Enabled As Boolean
    68. Get
    69. Return _enabled
    70. End Get
    71. End Property
    72. Public ReadOnly Property Technique As String
    73. Get
    74. Return _technique
    75. End Get
    76. End Property
    77. End Class
    78. <AttributeUsage(AttributeTargets.Method, AllowMultiple:=False, Inherited:=False)> _
    79. Public Class PerformanceTestAttribute
    80. Inherits Attribute
    81. Private _milliseconds As Integer
    82. Public Sub New(ByVal milliseconds As Integer)
    83. If milliseconds < 0 Then Throw New ArgumentOutOfRangeException("milliseconds", "Amount of milliseconds must be greater than zero.")
    84. _milliseconds = milliseconds
    85. End Sub
    86. Public ReadOnly Property Milliseconds As Integer
    87. Get
    88. Return _milliseconds
    89. End Get
    90. End Property
    91. End Class

    Das ist zwar von der Gestaltung und Ausarbeitung her noch sehr unschön, aber es erfüllt seinen Zweck vorerst. Tests legst du in einer partiellen Klasse Testing ab:

    VB.NET-Quellcode

    1. Partial Class Testing
    2. <Test("Some empty test")>
    3. <PerformanceTest(1000)>
    4. Public Shared Sub SomePerformanceTest()
    5. End Sub
    6. End Class

    Test definiert, dass eine Methode zu testen ist (sofern Enabled = True, Technique beschreibt die Methode genauer), PerformanceTest definiert dann Werte für den Performancetest. Weitere Tests würde man in PerformTest hinzufügen. Die Methode ist in dieser Ausführung aber hässlich. Tests sollte man eher als Klasse modellieren. Übrigens hätte man auch ein Modul verwenden können, ich bin aber von den Eigenschaften von VB-Modulen eher nicht begeistert.

    Gruß
    ~blaze~

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „~blaze~“ ()