Erzeugung Shared Objektinstanz

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

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    Erzeugung Shared Objektinstanz

    Hallo,

    was löst die Erstellung der Instanz aus? In 1 fliegt Zeile 2 noch vor dem Eventhandler. In 2 fliegts erst nach Aufruf aber vor Erstellen der Testinstanz (Nach Zeile 13, aber vor Sub New()). In 3 passiert erwartungsgemäß gar nichts.

    VB.NET-Quellcode

    1. Friend Class Test
    2. Friend Shared Aufbau As New StringBuilder '''Hier
    3. End Class
    4. '1
    5. Friend Class Form1
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. Dim a = Test.Aufbau
    8. End Sub
    9. End Class
    10. '2
    11. Friend Class Form1
    12. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    13. Dim Test1 = New Test
    14. End Sub
    15. End Class
    16. '3
    17. Friend Class Form1
    18. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    19. End Sub
    20. End Class


    Viele Grüße
    @Haudruferzappeltnoch Lies Dir mal die Meldungen und die Vorschläge des Systems durch.

    VB.NET-Quellcode

    1. Imports System.Text
    löst Dein Problem.
    Dies alles funktioniert:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.Text
    2. Public Class Form1
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim a = Test.Aufbau
    5. MessageBox.Show(a.ToString())
    6. End Sub
    7. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    8. Dim Test1 = New Test
    9. End Sub
    10. Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
    11. End Sub
    12. End Class
    13. Friend Class Test
    14. Friend Shared Aufbau As New StringBuilder 'Hier
    15. 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!
    (ähm - ich hab eine Weile gebraucht, um ühaupt zu einer Vermutung zu kommen, was du wohl mit "fliegen" meinen könntest - ich wär dankbar, wenn du dich manchmal um klarereres Entwickler-Undeutsch bemühen tätest)
    jdfs:
    Zeile #2 wird aufgerufen bei der 'TypInitialisierung'.
    Die findet statt, sobald erstmalig ein Objekt des Typs erzeugt wird.
    Oder wenn ein Shared Member des Typs abgerufen wird.
    Also sehr früh.
    Es gibt übrigens auch eine Shared Sub New. Standardmässig ist die verborgen, kann man aber auch ausschreiben:

    VB.NET-Quellcode

    1. Friend Class Test
    2. Friend Shared Aufbau As New StringBuilder '''Hier
    3. Shared Sub New
    4. 'naja, eigentlich hier
    5. End Sub
    6. End Class
    7. '1
    8. Friend Class Form1
    9. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    10. Dim a = Test.Aufbau
    11. End Sub
    12. End Class
    13. '2
    14. Friend Class Form1
    15. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    16. Dim Test1 = New Test
    17. End Sub
    18. End Class
    19. '3
    20. Friend Class Form1
    21. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    22. End Sub
    23. End Class
    Ich glaube, es geht um die Frage, warum bei Verwendung von Variante 1 die Zeile#2 ausgelöst wird, bevor der Zugriff auf Test.Aufbau vorgenommen wird. Daran zu erkennen, dann man in Z#2 einen Haltepunkt setzt und dann den FormButton klickt. Dann wird nämlich erst der Haltepunkt in Z#2 erreicht und dann eben erst der ButtonClick-EventHandler aufgerufen und dann erst der Zugriff auf Test.Aufbau vorgenommen.
    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 tut mir Leid, fliegen kann man auch so verstehen als käme da eine Fehler.
    Ich meinte eher der Programmablaufzeiger fliegt an den Haltepunkt :D So wie @VaporiZed es herausgefunden hat.

    @ErfinderDesRades Deiner Erklärung nach sollte Variante 1 auch erst nach Zeile 7 vom Programm her bei Zeile 2 laufen.
    Die Sub New Methoden und New deklarierte Member teilen sich den Erstellungsprozess, meist sind die Member zuerst dran. Vielleicht nur ein Studio Trick
    Es scheint, als ob der Computer dann die Klasse instanziiert, wenn die Möglichkeit besteht, dass sie genutzt wird:

    VB.NET-Quellcode

    1. Friend Class FrmMain
    2. Dim Random As New Random
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. DontCreateTestInstance()
    5. End Sub
    6. Private Sub DontCreateTestInstance() 'wird beim Kompilieren wegoptimiert -> kein Erreichen des Haltepunkts
    7. If False Then
    8. Dim a = Test.Aufbau
    9. End If
    10. End Sub
    11. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    12. PossiblyCreateTestInstance()
    13. End Sub
    14. Private Sub PossiblyCreateTestInstance() 'Es kann zwar !logisch! nicht zu einem Erreichen der Dim-Zeile kommen, aber trotzdem wird die Instanziierung vorsorglich vorgenommen
    15. If Random.Next(2) = 10 Then
    16. Dim a = Test.Aufbau
    17. End If
    18. End Sub
    19. End Class
    20. Friend Class Test
    21. Friend Shared Aufbau As New Text.StringBuilder
    22. End Class

    Wodurch aber der Aufruf erfolgt, ist damit nicht geklärt, da die Aufrufliste auch nicht konkret wird.
    Bilder
    • Aufrufliste.png

      4,25 kB, 621×78, 39 mal angesehen
    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.