2017-11-21 2 views
-3

Ich habe eine Assembly, die eine öffentliche statische Klasse und Member enthält, sie haben einen statischen Konstruktor, der alle statischen Member initialisiert. Wenn ich die Assembly lade, werden alle meine Mitglieder in den Speicher geladen, wenn ja, gibt es dann keine System-Ausnahme?Statische Klasse und Member

+0

Sie werden nach dem ersten Aufruf an die Mitglieder der Klasse initialisiert und sie werden entsorgt, sobald keine Ressource mehr in der Klasse ist. – FCin

+0

@FCin statische Felder sind verwurzelt, so dass sie nicht Müll gesammelt werden; und Dinge, die * Müll gesammelt sind, werden niemals "entsorgt" - sie könnten * "finalisiert" werden (aber das ist nicht garantiert) –

+0

@MarcGravell Also Speicher für statische Objekte wird nie freigegeben? Sie werden das Gedächtnis besetzen, obwohl es keinen Bezug zu ihnen gibt? – FCin

Antwort

3

a: statische Konstruktoren werden nicht geladen, nur weil Sie eine Assembly laden; genau dann, wenn sie sind ausgeführt ist kompliziert und hängt von beforefieldinit und wenn die statischen Feldern sie aussehen werden zum ersten Mal berührt werden - aber „irgendwann, bevor sie zum ersten Mal zugegriffen werden“ sollte es abdecken :)

b: Verwenden Sie genug Speicher (in Ihrem statischen Konstruktor), um ein OOM zu verursachen? wenn du bist: dann ja! wenn nicht, dann nein! Normalerweise lautet die Antwort "Nein". Und wenn Ihr statischer Konstruktor Dinge wie das Laden externer Daten tut, dann würde ich argumentieren, dass Ihr statischer Konstruktor es falsch macht.

Hinweis: Wenn ein statischer Konstruktor ausfällt, wird er als TypeInitializationException angezeigt; Die ursprüngliche Ursache wird .InnerException sein.

Verwandte Themen