2015-01-03 18 views
6

Aby być bardziej jasne, o moje pytanie, czy utworzyć tablicę danej klasy, na przykład:Czy metody instancji są duplikowane w pamięci dla każdego obiektu?

ExampleClass[] test = new ExampleClass[5]; 

wiem pięć ExampleClass przypadki stworzy kopię każdej zmiennej dla każdej klasy, ale są metody/funkcje powielone 5 razy w pamięci, czy też każdy z testów wskazuje tylko ten sam kod klasy jednej klasy? Jeśli zostanie powielony dla każdej klasy, będzie to po prostu strata pamięci.

+1

mógłbyś kod pocztowy, który wygląda prawidłowa? 'Test ExampleClass = nowy test [5]' wygląda bardzo dziwnie. –

+3

Alokowanie tablicy nie przydziela instancji klasy. Niezależnie od tego, czy używasz tablic, czy nie, wiele instancji klasy wszystkie używa tego samego kodu wykonywalnego i statycznych elementów danych; tylko elementy danych _instance_ (tj. pola) otrzymują nowe kopie dla każdej instancji klasy. Jeśli chcesz uzyskać bardziej szczegółową odpowiedź, umieść prawidłowy przykład kodu C# i wyjaśnij dokładnie, co chcesz wiedzieć. Tak jak obecnie, bardzo trudno jest ustalić na pewno, o co prosisz. –

Odpowiedz

8

Każdy rodzaj ładowane do AppDomain będzie mieć metoda tabeli strukturę, która posiada co definiuje metody tego typu, a także metody wirtualne pochodzące od jednostki (zwykle obiektu) i metod zdefiniowanych w dowolnym realizowanego interfejsu.

Ta tabela metod jest wskazywana przez każdą instancję tego obiektu. Tak więc każde wystąpienie nie powoduje powielenia wszystkich metod zdefiniowanych przez ten typ, ale wskazuje na tę strukturę tabeli metod z odniesieniem.

Na przykład:

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

MojaKlasa ta będzie mieć tablicę czym sposób obejmuje:

  • MyStaticMethod
  • MyInstanceMethod
  • usuwać
  • i inne metody wirtualne pochodzące z System.Object

Wystarczy popatrzeć na ładne schemat metody tabeli:

Method Table Diagram

można sprawdzić cały artykuł na temat sposobu tabelach here

+0

Czy ta tabela metod została kiedykolwiek usunięta z pamięci? na przykład czy śmieciarz wyczyścił wszystkie wystąpienia określonego typu - czy tablica metod tego typu nadal będzie w pamięci? – BornToCode

Powiązane problemy