2012-06-23 12 views
5

Eine Klasse besteht normalerweise aus Elementvariablen & Methoden. Wenn wir eine Instanz einer Klasse erstellen, wird Speicher für Membervariablen einer Klasse reserviert. Speichern Member-Methoden auch Speicher? Wo werden diese Methoden gespeichert?Speichert Klassenmitglieder Speicher?

+5

Methodenimplementierungen belegen Speicher pro Typ (und ich glaube, dass pro Verfeinerung mit Generics?), Aber das * nicht * erhöht sich pro Objektinstanz. Z.B. 'obj.GetType()' gibt den Typ zurück, der diese Methoden repräsentiert (und eine Menge anderer Dinge). Die (Instanz) * Variablen * sind natürlich pro Instanz. –

+0

@pst, warum Post so gute Antwort als Kommentar? –

+0

@AlexeiLevenkov macht einen feinen Punkt. Ich hätte das definitiv gewählt, und ich beantwortete diese Frage selbst mit dem, was ich für eine ziemlich anständige Antwort halte. –

Antwort

3

Sagen wir die folgende Klasse haben:

public class Person 
{ 
    public string Name { get; set; } 

    public Person(string name) 
    { 
     Name = name; 
    } 

    public string SayName() 
    { 
     string hello = "Hello! My name is "; 
     return hello + name; 
    } 
} 

Person p = new Person("John"); 
string yourName = p.SayName(); 

Die SayName() Funktion geht auf die Call Stack, und das Person p Objekt und es ist Eigenschaften (Name) in Erinnerung bleiben wird, bis die Garbage Collection kommt und reinigt ihn.

In Bezug auf Speicher sollten Sie mehr mit den Instanzfeldern (Eigenschaften) des Objekts, der Anzahl der Objekte, die Sie beschäftigen, und ob Ihr Objekt eine Zeit von Reader oder Connection ist. Wenn Ihr Objekt ein Reader oder Connection ist, müssen Sie eine using Anweisung in Betracht ziehen.

Pseudo-Code:

using(DatabaseConnection dbConn = new DatabaseConnection() 
{ 
    // Process your calls and data 
} 
// The object is Disposable and it's resources are cleared 
+0

"Die Variablen in SayName(), die wäre hallo, bleibe nur im Speicher, während die Funktion im Bereich ist. Sobald die Funktion beendet ist, ist die Variable nicht mehr im Speicher. " Nicht ganz richtig, der GC kann sie sammeln, sobald die Referenz nicht mehr benötigt wird (und dies schließt "das" ein!) – porges

+0

Ja. Das ist wahr. Ich denke, ich hätte den Zugang klarer machen müssen. –

+2

"einige Zeit von' Reader' oder 'Connection'" - einfach generalisierend zu 'IDisposable' ist wahrscheinlich klarer, IMO –

0

Klasse ist nur ein blauer Druck, Es spielt belegt keinen Raum, solange Variable vom Typ Klasse nicht definiert hat. Sobald das Objekt/die Instanz der Typklasse definiert ist, belegt das Klassenmitglied Speicherplatz im Speicher. Und die Größe der Instanz ist gleich der Summe der Größe der Mitglieder in der Klasse definieren.

Verwandte Themen