Klassenvariablen an eine andere Variable übergeben

  • VB.NET

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Klassenvariablen an eine andere Variable übergeben

    Hallo,

    ich bin noch ein ziemlicher Neuling mit VB Programmierung.

    ich habe zwei Variablen (retfrei & rettext) von der Klasse SymbolTyp

    VB.NET-Quellcode

    1. Public Class SymbolTyp
    2. Public symnum As Integer
    3. Public symname As String
    4. Public symdescribe As String
    5. Public xkosym As Decimal
    6. Public ykosym As Decimal
    7. Public xdim As Decimal
    8. Public ydim As Decimal
    9. Public schiyp As Decimal
    10. Public schiym As Decimal
    11. Public schixp As Decimal
    12. Public schixm As Decimal
    13. Public belfak As Decimal
    14. Public grp_linum As Integer
    15. Public grp_linxdim As Decimal
    16. Public grp_linrast As Decimal
    17. Public randym As Decimal
    18. Public randyp As Decimal
    19. Public randxm As Decimal
    20. Public randxp As Decimal
    21. Public refpointx As Decimal
    22. Public refpointy As Decimal
    23. End Class
    24. Public retfrei, rettext As New SymbolTyp


    Ich weise meiner Variable Werte zu

    VB.NET-Quellcode

    1. retfrei.symnum = 1
    2. retfrei.symname = "BLA"
    3. retfrei.symdescribe = "BLABLA"
    4. retfrei.xkosym = 0
    5. retfrei.ykosym = 0
    6. retfrei.xdim =0
    7. retfrei.ydim = 0
    8. retfrei.schiyp = 0
    9. retfrei.schiym =0
    10. retfrei.schixp = 0
    11. retfrei.schixm =0
    12. retfrei.belfak = 0
    13. retfrei.grp_linum = 0
    14. retfrei.grp_linxdim = 0
    15. retfrei.grp_linrast = 0
    16. retfrei.randym =0
    17. retfrei.randyp =0
    18. retfrei.randxm =0
    19. retfrei.randxp = 0
    20. retfrei.refpointx =0
    21. retfrei.refpointy = 0


    Anschließend übergebe ich meiner anderen Variable diese Werte

    VB.NET-Quellcode

    1. rettext = retfrei


    rettext hat jetzt dieselben Werte wie retfrei, aber wenn ich nun z.B den Wert rettext.symnum ändere, ändert sich auch automatisch der Wert von retfrei.symnum.

    Jetzt zu meiner Frage, wie kann ich das verhindern, sodass die beiden Variablen vollkommen unabhängig von einander sind?

    Danke.
    Klassen sind Referenztypen. Die Variable retfrei hat nur einen Zeiger auf die eigentlichen Daten im Speicher.
    Mit der Zuweisung

    VB.NET-Quellcode

    1. rettext = retfrei

    Kopierst du nicht Werte sondern setzt den Zeiger gleich. dH. beide Objektvariablen zeigen auf die gleichen Daten.

    Du könntest eine Structure erstellen (anstatt der Class). Diese sind Wertetypen und da werden bei der Zuweisung die Daten und keine Zeiger kopiert, da die Daten nicht im Speicher sondern direkt auf dem Prozessorstack liegen.

    lg

    EDIT: im Entwicklerbuch wird der Unterschied gut erläutert (Gratis zum Download: microsoft.com/germany/msdn/akt…008dasentwicklerbuch.mspx)
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    fugo schrieb:

    als anstatt der Klasse eine Struktur zu verwenden?
    Das würde ich Dir dringend empfehlen.
    Oder Du baust in die Klasse SymbolTyp einen Zuweisungs-Operator (=) und einen Copy-Konstruktor ein, über die Du dann arbeiten könntest.
    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 hab das jz folgendermaßen gelöst.

    VB.NET-Quellcode

    1. Public Class SymbolTyp
    2. Public symnum As Integer
    3. Public symname As String
    4. Public symdescribe As String
    5. Public xkosym As Decimal
    6. Public ykosym As Decimal
    7. Public xdim As Decimal
    8. Public ydim As Decimal
    9. Public schiyp As Decimal
    10. Public schiym As Decimal
    11. Public schixp As Decimal
    12. Public schixm As Decimal
    13. Public belfak As Decimal
    14. Public grp_linum As Integer
    15. Public grp_linxdim As Decimal
    16. Public grp_linrast As Decimal
    17. Public randym As Decimal
    18. Public randyp As Decimal
    19. Public randxm As Decimal
    20. Public randxp As Decimal
    21. Public refpointx As Decimal
    22. Public refpointy As Decimal
    23. Public Function ShallowCopy() As RetiSymbolWerteTyp
    24. Return DirectCast(Me.MemberwiseClone(), RetiSymbolWerteTyp)
    25. End Function
    26. End Class


    VB.NET-Quellcode

    1. rettext = DirectCast(retfrei.ShallowCopy, SymbolTyp)


    Mit der obigen Änderung funktioniert es, oder wäre es sinnvoller die Klasse in eine Struktur zu ändern?

    Danke
    Solange kein Referenztyp drin ist, mach eine Struktur.
    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!
    aber die Strings, die drin sind, sind Referenztypen.

    ich würde eine Klasse empfehlen, die ICloneable implementiert (oder was mit Copy-Konstruktor).

    Das Verhalten von Strukturen ist oft etwas überraschend: Gibt man eine Struktur in eine annere Methode, so kommt da nur die Kopie der Struktur an. Ändert diese Methode nun Eigenschaften der Struktur, so muß man beachten, dass der Aufrufer der Methode davon nix mitbekommt, denn die Methode ändert ja nur an einer Kopie seiner Struktur.

    Hingegen bei einer ICloneablen Klasse kann man entscheiden, und ist im Code direkt lesbar, ob ein Klon oder das Objekt selbst übergeben wird.