Structure & Funktion - Boolean wird in Sub verwendet aber davor verändert?

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von Anoth3rB0y.

    Structure & Funktion - Boolean wird in Sub verwendet aber davor verändert?

    Hallo,

    Ich habe hier eine Structure:

    VB.NET-Quellcode

    1. Private Structure CheckDetails
    2. Dim Exists, Locked, IsAdmin, IsCm, IsNormal As Boolean
    3. Dim LockAdmin, LockReason, Status As String
    4. End Structure



    VB.NET-Quellcode

    1. Private Function Check(ByVal Id As String, ByVal Nick As String) As CheckDetails
    2. Dim C As New CheckDetails
    3. Hier habe ich dann ifs bla bla..
    4. C.Exists = True
    5. C.IsNormal = True
    6. Console.WriteLine(C.IsNormal) ' Hier wird True angezeigt
    7. Console.WriteLine(C.Exists)' Hier wird auch True angezeigt
    8. Return C
    9. End Function



    Jetzt benutze ich die Werte hier in dem Sub:


    VB.NET-Quellcode

    1. Private Sub Login(ByVal D As String())
    2. Dim L As CheckDetails = Check(D(1), D(2))
    3. Console.WriteLine(L.IsNormal)
    4. Console.WriteLine(L.Exists)
    5. End Sub



    Und beide werden False angezeigt. Wieso?

    picoflop schrieb:

    Im Zweifel weil Structure ein WERTtyp ist.

    Structures nur einsetzen, wenn man 150% genau weiß, was "boxing" und "unboxing" bedeutet und was der Unterschied zwischen "heap" und "stack" ist. Wenn man sich unsicher ist: Class verwenden!

    Mag ja vielleicht sein. Aber man lernt nicht, dass Feuer heiß ist, ohne es mal anzufassen.

    Ich bin es ja am lernen und die Structure ist ja auch wirklich noch sehr übersichtlich(finde ich zumindest) und ich hätte das Thema am liebsten in Grundlagen reingestellt, weils doch eigentlich gar nicht so übertrieben schwer ist.

    Siehst du denn keinen Fehler?

    Anoth3rB0y schrieb:

    Siehst du denn keinen Fehler?

    Doch. Der Fehler: Ich habe dir ein paar Begriffe genannt und du hast vergessen, die Thematik nachzuschlagen!

    die Structure ist ja auch wirklich noch sehr übersichtlich(finde ich zumindest)

    Structures sind in der Tat ganz einfache Sachen. In einer "Objekt"-Welt werden sie aber schnell zu einem fehlerproduzierenden Monster! Das Problem bei Strutures ist halt, dass sie einfach wirken, aber komplexe Wechselwirkungen haben können.


    edit
    s.auch:
    msdn.microsoft.com/en-us/magazine/cc301569.aspx
    ganz unten dann ein wichtiger hinweis:
    The concepts discussed in this column are extremely important to all .NET developers. You should really understand the difference between reference types and value types. You must also understand which operations require boxing, and if you're using a compiler that boxes value types automatically (like C# and Visual Basic®) you should also learn when compilers are going to do this and what effect it has on your code. I can't emphasize enough that a misinterpretation of these concepts can easily cause you to create subtle bugs and performance slowdowns in your program.

    Ich bin schon mal drauf reingefallen. Seitdem vermeide ich Structs wann immer möglich!

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

    Nimm eine Form-Anwendung und es geht auf Anhieb:
    Bilder
    • Check.jpg

      65,78 kB, 825×547, 137 mal angesehen
    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!
    Ich würde nur dann eine Console-Anwendung schreiben, wenn es mit einer Form-Anwendung nicht (so gut) geht oder ich einen Automaten baue, z.B. Übertragung eines C++-Files nach C# oder so.
    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!

    Anoth3rB0y schrieb:

    Ich komm einfach nicht dahinter, warum die Console False draus macht.
    Deine Console.
    Meine macht es richtig:
    Bilder
    • console.jpg

      45,03 kB, 585×483, 126 mal angesehen
    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!

    picoflop schrieb:

    Was ist mit dem Teil, den wir NICHT kennen? ;)

    Erst danach setzt er ja die Werte auf True:

    VB.NET-Quellcode

    1. 'Hier habe ich dann ifs bla bla..
    2. C.Exists = True
    3. C.IsNormal = True
    @TE: Oder etwa nicht?
    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!
    Hey,

    also das Problem besteht weiterhin!

    Der aktuelle Code sieht so aus:

    Die Structure:

    VB.NET-Quellcode

    1. Private Structure CheckDetails
    2. Public Exists, Locked As Boolean
    3. Public LockAdmin, LockReason, Status As String
    4. End Structure


    VB.NET-Quellcode

    1. Private Function Check(ByVal Id As String, ByVal Nick As String) As CheckDetails
    2. Dim C As New CheckDetails
    3. Dim Checkk As New Thread(Sub()
    4. Dim T As String = Id & "\" & Nick
    5. For Each a As String In Nicks.Where(Function(z) z.Contains(T))
    6. Dim D As String() = a.Split(CChar("\"))
    7. If D.Length > 0 Then C.Exists = True
    8. If D(3) = "+" Then C.Locked = False
    9. If D(3) = "*" Then
    10. C.Locked = True
    11. C.LockReason = D(4)
    12. C.LockAdmin = D(5)
    13. End If
    14. If D(2) = "2" Then C.Status = "Normal"
    15. If D(2) = "3" Then C.Status = "Cm"
    16. If D(2) = "4" Then C.Status = "Admin"
    17. Next
    18. Console.WriteLine("(Funktion) Status: " & C.Status)
    19. Console.WriteLine("(Funktion) Existiert: " & C.Exists)
    20. End Sub)
    21. Checkk.IsBackground = True : Checkk.Start()
    22. Return C
    23. End Function


    VB.NET-Quellcode

    1. Private Sub LF(ByVal D As String())
    2. Dim L As CheckDetails = Check(D(1), D(2))
    3. Console.WriteLine("(Sub) Status: " & L.Status)
    4. Console.WriteLine("(Sub) Exists: " & L.Exists)
    5. End Sub






    Die Funktion gibt alles richtig zurück.
    Im Sub müsste demnach dasselbe rauskommen wie in der Funktion,
    ist aber wie man sieht nicht der Fall.

    Ich hoffe mir kann vllt. nun jemand weiter helfen!

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

    Rinecamo schrieb:

    Ja nur läuft der Thread Asynchron und zu dem Zeitpunkt, wo du C zurückgibst, enthält es noch gar keine Werte.
    Oh shit wtf , Du hast recht.


    Hast du ne Idee, wie ich das ganze im Thread auslagern kann und trotztdem korrekt zurückgeben kann?
    Der Thread wäre mir gerade an der Stelle extrem wichtig, da sonst das ganze programm laggt.