2016-08-12 4 views
8

Ich habe ein paar kleine Zweifel mit Klassen und Objekten.Wie viele Methoden in einer Klasse werden im Speicher erstellt, wenn ein Objekt in C# erstellt wird?

In einer Klasse I haben 10 bis 20 Verfahren (gemeinsam unten)

public class tstCls 
    { 
     public void a1() 
     { } 
     void a2() 
     { } 
     void a3() 
     { } 
     void a4() 
     { } 
     void a5() 
     { } 
     void a6() 
     { } 
     void a7() 
     { } 
     void a8() 
     { } 
     void a9() 
     { } 
    } 

Wenn ein Objekt für die obige Klasse zu schaffen. Wie viele Methoden werden gespeichert? Nur die aufrufende Methode oder alle Methoden.

static void Main(string[] args) 
    { 
     tstCls objcls = new tstCls(); 
     objcls.a1(); 
    } 

Können Sie mir bitte auf das obige Szenario helfen.

+0

Siehe auch z.B. https://stackoverflow.com/questions/8204595/whats-the-method-representation-in-memory –

Antwort

5

Keine. Die Methoden werden nicht im Speicher erstellt, wenn Sie ein Objekt instanziieren, sondern nur die Felder und Eigenschaften.

Die Assembly, die die Methoden enthält, wird geladen, sobald auf einen Teil der Assembly verwiesen wird.

Methoden werden nur dann in den Speicher kompiliert, wenn sie aufgerufen werden. Der JIT (Just-In-Time-Compiler) wandelt die Methoden von IL in den Maschinencode um.

+0

Danke für die Antwort. Können Sie bitte einen Hinweis für das hier geben. – Anjali

+0

@Anjali - https://msdn.microsoft.com/en-us/library/ht8ecch6(v=vs.90).aspx – Enigmativity

0

wie viele Methoden im Speicher gespeichert werden

All. Alle Methoden werden im Speicher gespeichert.
Was wichtiger ist, sie werden alle einmal erstellt, unabhängig von der Anzahl der Instanzen.

So ist diese Aussage nicht präzise: "während erstellt ein Objekt für die oben genannte Klasse ...".

Jeder Assembliertyp erstellt eine Methode im Speicher - Methoden werden nicht für jede Instanz erstellt/kopiert.
So während des Ladens der Baugruppe werden alle Methoden erstellt und im Speicher gespeichert, und dann wird nur a1 für objcls Instanz aufgerufen.

+1

Streng genommen ist es möglicherweise nicht _all_ Methoden. Xamarin zum Beispiel hat einen Linker, der Methoden entfernen kann, die nicht verwendet werden: https://developer.xamarin.com/guides/ios/advanced_topics/linker/ –

+0

@IanMercer Danke für Ihren Kommentar. Was ist, wenn Linker "unbenutzte" Methode entfernt, und diese Methode dann durch Reflektion aufgerufen wird? Wie würde es auch wissen, dass diese Assembly nicht von einer anderen Bibliothek referenziert wird und die öffentliche Methode nicht aufgerufen wird? –

+0

Werfen Sie einen Blick auf den Link, erklärt es. Bei mobilen Geräten möchten Sie die kleinste mögliche Anwendung - Reflexion ist in der Regel weniger wichtig. Es ist wirklich auf C# -Sprache (Tag) im Vergleich zu einer bestimmten Implementierung davon. Die Sprache sagt nicht, dass alle Methoden zu einer Assembly kompiliert werden müssen. –

1

Für eine Instanz wird nur eine Methode erstellt.

können Sie diese artilce verweisen: Drill Into .NET Framework Internals to See How the CLR Creates Runtime Objects

Jede Klasse und Schnittstelle, wenn sie in eine AppDomain geladen wird durch eine MethodTable Datenstruktur im Speicher dargestellt werden. Dies ist ein Ergebnis der Klassenladeaktivität, bevor die erste Instanz des Objekts jemals erstellt wird. Während ObjectInstance den Status darstellt, steht MethodTable für das Verhalten. MethodTable bindet das Objekt Instanz an die vom Sprachcompiler generierten speicheradressierten Metadatenstrukturen über EEClass. Auf die Informationen in der MethodTable und den davon abhängenden Datenstrukturen kann über den verwalteten Code über System.Type zugegriffen werden. Ein Zeiger auf die MethodTable kann in verwaltetem Code über die Type.RuntimeTypeHandle-Eigenschaft selbst erworben werden. TypeHandle, das in der ObjectInstance enthalten ist, zeigt auf einen Offset vom Anfang der MethodTable. Dieser Offset ist standardmäßig 12 Bytes und enthält GC-Informationen, auf die hier nicht eingegangen wird.

enter image description here

+0

Beachten Sie, dass dieses Diagramm leicht veraltet ist, z. B. wurden IVMap-Tabellen durch [VSD] ersetzt (https://github.com/dotnet/coreclr/blob/master/Documentation/botr/virtual- stub- dispatch.md). Für die neuesten Informationen über JIT-Interna siehe [hier] (https://github.com/dotnet/coreclr/blob/master/Documentation/botr/ryujit-overview.md). –

Verwandte Themen