Ich glaube, Sie verwirrend Klassen mit sind, wo die Erinnerung lebt mit wie der Speicher auf bis gehalten wird. Wenn Sie eine Instanz einer normalen Klasse erstellen, befindet sich der Speicher dieser Instanz auf dem Heap. Ein Referenz zu dieser Instanz möglicherweise in einem Objekt auf dem Heap (wenn Sie eine Mitgliedsvariable in einer anderen Instanz eines Objekts darauf festlegen); oder eine Stapelvariable (wenn Sie eine Variable für das Objekt innerhalb einer Methode deklariert oder an einen Funktionsaufruf übergeben haben) oder in der Liste globaler Wurzeln (wenn es sich um eine statische Referenz handelt, z. B. eine Singleton-Referenz).
Eine statische Klasse kann nicht instanziiert werden. Es gibt keine "Referenz" auf die Klasse (außer Typinformationen). Seine Methoden sind nur Funktionen, die in den Speicher geladen werden, wenn die CLR die Assembly lädt. Sie könnten einen Delegaten erstellen, der auf eine dieser Methoden verweist, aber auch keinen Verweis auf eine Instanz der Klasse. Das ist nur ein Zeiger auf eine Funktion.
Zum Beispiel betrachten Sie diesen Code:
class ObjectWrapper
{
Object obj = new Object();
}
static void Main(string[] args)
{
ObjectWrapper wrapper = new ObjectWrapper();
...
}
Die Main-Methode eine Instanz eines ObjectWrapper Klasse erstellt. Diese Instanz lebt auf dem Heap.
Innerhalb der ObjectWrapper-Instanz gibt es eine Instanz der Klasse Object, die sich auf dem Heap befindet. Die Referenz auf diese Klasse befindet sich in der Instanz, also könnte man sich die Referenz als "im Haufen leben" vorstellen.
Nun vergleichen Sie diese mit dem folgenden Code:
class Singleton
{
static readonly instance = new Singleton();
}
Die Instanz des Singleton-Objekt auf dem Heap lebt auch. Die Referenz ist jedoch eine statische Referenz. Es wird von der CLR in einer Liste von globalen oder "root" -Referenzen verwaltet.
Nun ein Blick auf diese statische Klasse:
class ObjectWrapper
{
Object obj = new Object();
}
static class HelperMethods
{
static int DoSomethingUseful(ObjectWrapper wrapper1)
{
ObjectWraper wrapper2 = wrapper1;
// code here
}
}
HelperMethods eine statische Klasse ist. Sie können die HelperMethods-Klasse nicht instanziieren. Es dürfen keine Objekte dieser Klasse auf dem Heap vorhanden sein. In der DoSomethingUseful-Methode hat es jedoch zwei Verweise auf eine Instanz der ObjectWrapper-Klasse im Stapel. Eins wird übergeben, und man wird innerhalb der Methode deklariert.
Ich verstehe keinen Teil dieser Frage. Was meinst du mit "seinem Wert" und "seinem Ref"? –
Ich erwarte, dass er darüber spricht, wie ausführbarer Code von Datenmitgliedern getrennt wird. –
Unter anderem ist es "es". – jason