Referenz "vergisst" Wert

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von Artentus.

    Referenz "vergisst" Wert

    Guten Morgen,

    ich hab hier gerade einen merkwürdigen Fehler. Folgendes Konstrukt:

    Quellcode

    1. class Main()
    2. Sub Main_Sub()
    3. Dim a as ClassA = New ClassA
    4. Dim b as ClassB = New ClassB
    5. Dim c as RandomClass = New(a, b)
    6. MsgBox(a.Property)
    7. MsgBox(b.Property)
    8. End Sub
    9. end class
    10. Class RandomClass
    11. Private LocalClassReference1 As ClassA
    12. Private LocalClassReference2 As ClassB
    13. Sub New(ByRef Inst1 as ClassA, ByRef Inst2 as ClassB)
    14. LocalClassReference1 = Inst1
    15. LocalClassReference2 = Inst2
    16. LocalClassReference1.Property = "abc"
    17. LocalClassReference2.Property = "def"
    18. End Sub
    19. End Class


    Also der Code sollte selbsterklärend sein. In der Instanz von RandomClass wird die Referenz von ClassA und ClassB übergeben, eine lokale Kopie der Referenz erzeugt und anschließend hierin geschrieben.

    Soweit zur Theorie. In der Praxis zeigt sich etwas ganz merkwürdiges: Während die erste MsgBox noch "abc" ausgibt, ist der Text der zweiten MsgBox = Nothing.

    Hat irgendjemand nen Plan, warum das so ist?
    Neben dem zu korrigierenden Konstruktor solltest du auch beachten, dass der Parameter intern kopiert wird und dann die zwei Objekte nicht mehr mit den zwei Objekten in deiner Randomclass identisch sind. Also müsstest du entweder die Parameter als Referenz übergeben oder die RandomClass selbst müsste die Ausgabe der Properties (im Sinne der Kapselung) übernehmen.

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

    Counterbug schrieb:


    Neben dem zu korrigierenden Konstruktor solltest du auch beachten, dass der Parameter intern kopiert wird und dann die zwei Objekte nicht mehr mit den zwei Objekten in deiner Randomclass identisch sind. Also müsstest du entweder die Parameter als Referenz übergeben oder die RandomClass selbst müsste die Ausgabe der Properties (im Sinne der Kapselung) übernehmen.
    Was meinst Du mit korrigiertem Konstruktor? Welche Parameter meinst Du genau? Variante 2 scheidet aus.

    Dass eine Kopie erstellt wird, ist mir bewusst. Nur sollte die bei einem ByRef Argument eben in genau die selbe Speicherzelle zeigen, wie die Originalreferenz.

    Ich muss nebenbei korrigieren: ClassB ist keine Klasse, sondern eine Variable einer Struktur.

    Gladii schrieb:

    Ich muss nebenbei korrigieren:
    Poste bitte einen Code, der sich compilieren lässt. X(
    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!

    Gladii schrieb:

    LocalClassReference2 = Inst2

    Da der Typ dieses Members eine Struktur ist, findet an dieser Stelle kein Duplizieren des Verweises statt, sondern der Inhalt der Struktur wird kopiert. Auf Strukturen gibt es in .NET keine Verweise. Du änderst danach den Inhalt der Kopie und gibst in der MsgBox den Inhalt des (unveränderten, noch Nothing) Originals aus.

    Nachtrag: Um in dieselbe Kerbe zu schlagen: Bitte Originalcode per Copy & Paste posten, ggf. persönliche oder sensible Infos nachträglich unkenntlich machen vor dem Absenden, aber nicht von Hand irgendeinen Phantasiecode hier reinhacken, das beschwört nur Tippfehler herauf, die uns bei der Hilfe bei deinem Problem nur auf Irrwege schicken bzw. den Code unverständlich machen.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Da der Typ dieses Members eine Struktur ist, findet an dieser Stelle
    kein Duplizieren des Verweises statt, sondern der Inhalt der Struktur
    wird kopiert. Auf Strukturen gibt es in .NET keine Verweise. Du änderst
    danach den Inhalt der Kopie und gibst in der MsgBox den Inhalt des
    (unveränderten, noch Nothing) Originals aus.
    Genau sowas habe ich auch befürchtet. Ich habe die Sturktur jetzt halt in eine Klasse gepackt und übergebe eine Variable des Typs Struktur. Damit geht es.


    Danke :)