Laden...

Speicheradresse adressof() ausgeben

Erstellt von Peter Bucher vor 17 Jahren Letzter Beitrag vor 17 Jahren 7.036 Views
Peter Bucher Themenstarter:in
5.942 Beiträge seit 2005
vor 17 Jahren
Speicheradresse adressof() ausgeben

Hallo

In C oder C++ gibt es doch den adressof() Operator.
Ist es in C# irgendwie möglich die Speicheradresse eines Objektes auszulesen und als String darzustellen / auszugeben?

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

M
1.439 Beiträge seit 2005
vor 17 Jahren

Nein, das geht nicht. Macht ja auch keinen Sinn, da sich die Adresse ja jederzeit ändern kann.
edit:
Mit dem fixed keyword kann man sich die Adresse holen, dies geht aber nur im unsafe Kontext und auch nicht direkt auf Objekte sondern nur auf Membervariablen(zumindest bei mir).

Peter Bucher Themenstarter:in
5.942 Beiträge seit 2005
vor 17 Jahren

Hallo marsgk

Ich wollte damit eigentlich nur etwas testen, Beispiel:


Test t = new Test();
t.Tuwas();
xyz.Add(t);

t = new Test(); // <-- Was passiert hier?

Was passiert dort, mir ist klar, das ich so ein neues Objekt erstelle
aber dies auf der gleichen Speicheradresse oder in eine neue?

Wäre es ratsam, "t" zuerst auf "null" zu stellen, bevor man man es mit einem neuen Objekt überschreibt?

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

M
1.439 Beiträge seit 2005
vor 17 Jahren

Ist genau so wie in C++, wobei t in C++ ein Pointer wäre.

Peter Bucher Themenstarter:in
5.942 Beiträge seit 2005
vor 17 Jahren

Original von marsgk
Ist genau so wie in C++, wobei t in C++ ein Pointer wäre.

*räusper*, ich kenn mich mit C und C++ nicht aus 😉
Auf jeden Fall nicht genug, um daraus jetzt eine Schlussfolgerung ziehen zu können.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

3.170 Beiträge seit 2006
vor 17 Jahren

t = new Test(); // <-- Was passiert hier?

Wenn Du t zuerst auf null stellst, passiert genau dasselbe, durch die Zuweisung von null wird das Objekt auch nicht zerstört.
Aber da wir hier mit "Managed Code" zu tun haben, macht das auch garnix. Wenn das Objekt nirgendwo mehr referenziert ist, räumt es irgendwann die Garbage-Collection weg.
Wenn Du das Objekt selbst explizit zerstören willst, solltest Du Dir mal das IDisposable-Interface ansehen.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Peter Bucher,

Was passiert hier?

es wird ein neues Objekt erzeugt. Das neu erzeuge Objekt hat mit dem bestehenden nichts zu tun. Das ändert sich auch nicht dadurch, dass du es (nach abschluss der Erzeugung) an eine Variable zuweist, die vorher das alte Objekt enthalten hat. Variablen sind nur Referenzen. Variablen verweisen auf Objekte, sind aber keine Objekte. Variablen stellen also nicht den Speicherplatz für die Objekte zur Verfügung, sondern nur den Speicherplatz für die Referenz. (In C++ ist das anders.)

herbivore

Peter Bucher Themenstarter:in
5.942 Beiträge seit 2005
vor 17 Jahren

Halllo Herbivore

Danke für deine Erläuterung.
Also kann ich schlussfolgernd sagen, dass ich eine Variable mehrmals mit einem neuen Objekt überschreiben und nutzen kann, ohne dass dies irgendwelche Nebenwirkungen nach sich trägt?

Mann muss da also nicht auf was spezielles achten?

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Peter Bucher,

Also kann ich schlussfolgernd sagen, dass ich eine Variable mehrmals mit einem neuen Objekt überschreiben und nutzen kann,

Du kannst eine Variable eben nicht mit einem anderen Objekt überschreiben, sondern nur die Referenz, die in der Variable gespeichert ist, mit einer Referenz auf ein neues Objekt überschreiben.

ohne dass dies irgendwelche Nebenwirkungen nach sich trägt?

Es hat die "Nebenwirkung", dass die alte Referenz überschrieben wird und damit verloren geht. Wenn die letzte Referenz auf ein Objekt verloren geht, kann es vom GC entfernt werden.

Mann muss da also nicht auf was spezielles achten?

Das kommt darauf an, was du darunter verstehst, aber ich denke, ich kann im Prinzip zustimmen.

herbivore

H
59 Beiträge seit 2005
vor 17 Jahren

Wenn Du das Objekt selbst explizit zerstören willst, solltest Du Dir mal das IDisposable-Interface ansehen.

Das stimmt so nicht, Dispose() dient zur Freigabe von unmanaged Resourcen, das Objekt wird dadurch nicht "zerstört". Solange eine Referenz auf ein Objekt existiert wird es vom GC nicht freigegeben, egal ob du es "disposed" oder nicht.

Peter Bucher Themenstarter:in
5.942 Beiträge seit 2005
vor 17 Jahren

Guten Morgen

Vielen Dank für eure Geduld, somit ist meine Frage 100% geklärt.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo harrylask,

Solange eine Referenz auf ein Objekt existiert wird es vom GC nicht freigegeben, egal ob du es "disposed" oder nicht.

ich hoffe ich verwirre jetzt keinen, aber der GC entfernt durchaus Objekte, auf die noch Referenzen existieren, z.B. bei zyklischen Strukturen (z.B. a referenziert b und b referenziert a). Diese könnten nämlich sonst nie freigegeben werden. Die Frage ist also, ob ein Objekt noch vom Programm aus über eine Referenz zu erreichen ist.

Das geht sogar soweit, dass er Variablen, deren Lebensdauer noch nicht beendet ist, als nicht mehr erreichbar ansieht, wenn diese im Code später nicht mehr angesprochen werden.

Bei folgendem Code


public static void Main ()
{
   Object obj = new Object ();
   Application.Run (new MyForm ());
   // <= hier keine Verwendung von obj
} // <= hier endet die Lebensdauer der Variable obj. Das mit new Object ()
  // erzeugte Objekt kann aber schon deutlich früher entfernt worden sein.

erkennt der GC, dass obj im weiteren Verlauf nicht mehr verwendet wird und sieht dass so an, als wäre obj vor dem Application.Run auf null gesetzt worden.

herbivore

Peter Bucher Themenstarter:in
5.942 Beiträge seit 2005
vor 17 Jahren

Hallo Herbivore

Interessant zu wissen.
Der Lifecircle-Scope von C# ist so grundverschieden, vorallem im Vergleich mit Scriptsprachen àla VBScript.

Dort lebt eine Variable "immer" 🙂

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

3.170 Beiträge seit 2006
vor 17 Jahren

Hallo,

@harrylask: Main Fehler mit dem IDisposable, danke, habs mir nochmal angeschaut.

@herbivore:
"Die Frage ist also, ob ein Objekt noch vom Programm aus über eine Referenz zu erreichen ist" -->
So in etwa hatte ich das gemeint, mit "nirgendwo mehr referenziert", hatte mich nur etwas unklar ausgedrückt, sorry.

Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo MarsStein,

ich habe die Aussage von harrylask ergänzt. Deine Aussage:

Wenn das Objekt nirgendwo mehr referenziert ist, räumt es irgendwann die Garbage-Collection weg.

ist ja korrekt. 🙂 Sie wäre es dann nicht, wenn du geschrieben hättest "genau dann, wenn".

herbivore