Gibt es eine Möglichkeit festzustellen, ob ein Objekt GC.SuppressFinalize aufgerufen hat oder nicht?Kann ich erkennen, ob ein Objekt GC.SuppressFinalize aufgerufen hat?
Ich habe ein Objekt, das so etwas wie dieses (für Klarheit elided ausgewachsene Dispose-Muster) aussieht:
public class ResourceWrapper {
private readonly bool _ownsResource;
private readonly UnmanagedResource _resource;
public ResourceWrapper(UnmanagedResource resource, bool ownsResource) {
_resource = resource;
_ownsResource = ownsResource;
if (!ownsResource)
GC.SuppressFinalize(this);
}
~ResourceWrapper() {
if (_ownsResource)
// clean up the unmanaged resource
}
}
Wenn der ownsResource
Konstruktorparameter false
ist, dann ist die Finalizerthread nichts zu tun haben - so es scheint vernünftig (wenn ein bisschen schrullig) GC.SuppressFinalize
direkt vom Konstruktor zu nennen. Da dieses Verhalten jedoch merkwürdig ist, bin ich sehr versucht, es in einem XML-Dokument-Kommentar zu notieren ... und wenn ich versucht bin, es zu kommentieren, dann sollte ich einen Komponententest dafür schreiben.
Aber während System.GC Methoden gesetzt hat ein finalizability des Objekts (SuppressFinalize, ReRegisterForFinalize), ich sehe keine Methoden erhalten ein finalizability des Objekts. Gibt es eine Möglichkeit, abzufragen, ob GC.SuppressFinalize für eine bestimmte Instanz aufgerufen wurde, kurz vor dem Kauf von Typemock oder dem Schreiben eines eigenen CLR-Hosts?
Beide gute Ideen, aber ich mag die zweite: Verschieben Sie die Verantwortung "Owner" auf ein separates Objekt. –
Die Verwendung eines separaten Objekttyps ist IMHO geeignet, sauberer zu sein, wenn es funktioniert (d. H. Der Wrapper weiß, wann er erstellt wird, ob die Ressource im Besitz sein wird und dieser Status sich nie ändert), erfordert aber möglicherweise etwas mehr Code. Es ist sicherlich nützlich, beide Techniken zur Verfügung zu haben. Wie bereits in der obigen Anleitung erwähnt, werden die Finalizer standardmäßig ausgeführt, bevor sie eingerichtet werden. das scheint ein bisschen schlampig, aber wird wahrscheinlich in den meisten Szenarien kein Problem sein. – supercat