2015-01-03 8 views
6

Um mehr Klarheit über meine Frage, wenn Sie ein Array einer bestimmten Klasse erstellen: zum BeispielSind Instanzmethoden für jedes Objekt im Speicher dupliziert?

ExampleClass[] test = new ExampleClass[5]; 

Ich weiß, dass die fünf ExampleClass Instanzen für jede Klasse eine Kopie jeder Variable erstellen würde, aber sind die Methoden/Funktionen doppelt im Speicher dupliziert, oder zeigen die einzelnen Tests nur auf die gleiche Codebasis? Wenn es für jede Klasse dupliziert würde, wäre das nur eine Verschwendung von Speicher.

+1

Könnten Sie bitte Code schreiben, die korrekt aussieht? 'ExampleClass test = new test [5]' sieht sehr seltsam aus. –

+3

Das Zuweisen eines Arrays weist keine Klasseninstanzen zu. Unabhängig davon, ob Arrays verwendet werden oder nicht, verwenden mehrere Instanzen einer Klasse denselben ausführbaren Code und dieselben statischen Datenelemente. Nur die _instance_-Datenelemente (d. h. Felder) erhalten neue Kopien für jede Instanz der Klasse. Wenn Sie eine spezifischere Antwort wünschen, posten Sie ein gültiges C# -Codebeispiel und erklären Sie genau, was Sie wissen möchten. Wie es jetzt ist, ist es sehr schwer zu verstehen, was Sie fragen. –

Antwort

8

Jede Art in ein AppDomain geladen wird eine Methode Tabelle Struktur haben, die jede Methode enthält, die definiert, ein, sowie die virtuellen Methoden abgeleitet von den Eltern (typischerweise Object) und die von jedem implementierte Schnittstelle definierten Methoden.

Diese Methodentabelle wird von jeder Instanz dieses Objekts angezeigt. Jede Instanz dupliziert also nicht alle Methoden, die von diesem Typ definiert werden, aber verweist auf diese Methoden-Tabellenstruktur mit einer Referenz.

Zum Beispiel:

public class MyClass : IDisposable 
{ 
     private static void MyStaticMethod() 
     { 
      // .... 
     } 
     public void MyInstanceMethod() 
     { 
      // .... 
     } 
     public void Dispose() 
     { 
      throw new NotImplementedException(); 
     } 
} 

Diese MyClass wird mit einer Methode Tabelle haben:

  • MyStaticMethod
  • MyInstanceMethod
  • Entsorgen
  • und andere virtuelle Methoden, die von System.Object

Werfen Sie einen Blick auf schöne Diagramm Methodentabelle:

Method Table Diagram

Sie können den ganzen Artikel über Methodentabellen überprüfen here

+0

Wird diese Methodentabelle jemals aus dem Speicher entladen? z.B. Wenn der Garbage Collector alle Instanzen eines bestimmten Typs bereinigt hat - bleibt die Methodentabelle dieses Typs im Speicher erhalten? – BornToCode

Verwandte Themen