Objektvariable als Pointer?

multitasker

Mitglied
Hallo,
eine Variable vom Typ Object kann jeden DAtentyp speichern. Und sie ist ein Verweistyp. Und deshalb dachte ich, kann sie dann auch als eine Art C++ Pointer verwendet werden. dAs ist auf jedenfalls das, was ich darunter verstehe.

Beispiel wie ihr seht ist in C#

Code:
            string s="STRING";
            object obj;

            obj = s;
            obj = "neuerSTring";

s ist nach obj="neuerString" immer noch "STring". Ich habe erwartet, dass s nun "neuerSTring" enthält.

Was für eine Möglichkeit gibt es in C# oder VB.Net einen "Pointer" oder Verweis zu verwenden. Nur per unmanaged pointer?
 
Hi

Deine Erwartung ist falsch, auch bei anderen Reference Types wäre sie das im übrigen.

obj und s sind nur Verweise auf den eigentlichen String.
bei obj = s sagst du dem Objekt obj wo der String-Literal "STRING" im Speicher liegt.
Mit obj = "neuerSTring" wird einen neue Adresse in das Objekt eingetragen mit dem Verweis auf den neuen String Literal.

@Pointer
In .NET sind (bis auf die wenigen Value Types) alles Pointer. Die eigentlichen Objekte landen auf dem Heap (managed) im Objekt auf dem Stack (managed) stehen nur die Verweise auf die Adresse im Heap.

Nichtverwaltet Pointer zu nutzen ist nicht empfehlenswert, da du so leicht unerwartetes Verhalten hervorufen kannst.
Falls du dich damit jedoch etwas genauer beschäftigen willst:
Such mal auf CodeProject.com nach unsafe

Aber was ist denn dein eigentliches Problem bzw. was hast du vor?
 
Seit ich im .NET entwickle ist mir natürlich aufgefallen, dass die klassischen Pointer eigentlich gar nicht mehr gebraucht werden. Oder zumindest habe ich sie bis jetzt noch nicht vermisst. Mir geht es deshalb - um deine letzte Frage aufzugreifen - nicth um ein konkretes Problem.

Nochmal, habe ich das so richtig verstanden. Wenn ich einer Variablen mit dem Typ Objekt eine Variable zuweise, dann referenziert obj schon auf den selben Speicherbereich wie s.

obj = s;

Aber beim erneuten zuweisen eines Strings an obj, nicht mehr, da "neuerString" in einem anderen Speicherbereich liegt.

obj = "neuerString";
 
Hi

In Managed C++ hast du noch die Pointer wie unter Native C++. C# kapselt das ganz jedoch für dich.

Und ja, du hast es richtig verstanden
Da "STRING" != "neuerString"
 
Zurück