2009-05-29 5 views

Antwort

2

Ja, mit einigen Sprachen. C++/CLI wird Dipose-Aufrufe für IDisposable-Implementierer ausgeben, wenn ihre Nicht-Heap-Zuordnungen außerhalb des Gültigkeitsbereichs liegen (was ihnen effektiv die gleiche Semantik gibt wie die Stapelzuweisung von Ressourcen in normalem C++). Außerdem wird die C++/CLI-Destruktorsyntax von ~ Classname zu einer Implementierung von Dispose (und bewirkt, dass die Klasse IDisposable implementiert).

Ich würde andere Sprachen mit traditioneller deterministischer Zerstörung erwarten, diese Politik mit der Zeit anzunehmen. Wie andere bereits erwähnt haben, können Sie es in C# mit "using" emulieren, aber es ist nicht ganz dasselbe.

1

Wenn IDisposable implementiert wird und Sie einen using-Block verwenden, sicher.

3

Nr

Wenn Sie andere Ressourcen als Arbeitsspeicher bereinigen, implementieren IDisposable und Ihre Objekte mit using Blöcken erstellen. Wenn Sie Speicher aufräumen müssen, können Sie es wirklich dem Garbage Collector überlassen.

0

Nein, gibt es nicht.

0

Nein, in keiner .NET-Sprache gibt es eine deterministische Finalisierung. Der Garbage Collector ist verantwortlich für das Finalisieren von Objekten, die keine Wurzeln in der Anwendung haben.

+1

Er fragte jedoch nicht nach Finalisierung, er fragte nach Benachrichtigung. Da es in keiner .NET-Sprache verfügbar ist, können Sie, wenn Sie in C++/CLI (dem Nachfolger von Managed C++, das zuerst in VS2005 erschien) programmieren, eine Referenz auf ein Objekt deklarieren, als wäre es eine automatische Variable . Wenn die Klasse dieses Objekts IDisposable implementiert, wird es benachrichtigt, wenn es den Gültigkeitsbereich verlässt. Dies ist eine Eigenschaft, die leider in C# IMHO fehlt. – U62

+0

btw. war ich nicht das, der abgelehnt wurde! – U62

0

Wenn es IDisposable implementiert, Ihre Methode Dispose() herausfinden würde:

using (var c = new YourClassImplementsIDisposable()) 
{ 
    // Stuff happens 
} 
// c.Dispose has been called 

sonst nicht, weil das Objekt nur, bis

GC 'hängen'