2009-10-04 5 views
6

Gibt es eine bekannte (dokumentierte) Menge von .NET-Typen, die Speicher im nicht verwalteten Teil des Prozessspeichers zuweisen?Welche verwalteten Klassen in .NET Framework reservieren (oder verwenden) nicht verwalteten Speicher?

Zum Beispiel dokumentiert Microsoft, dass die WPF-Infrastruktur nicht verwalteten Speicher für das beibehaltene Wiedergabemodell zuweist, um die Leistung zu optimieren. Gibt es andere Teile des .NET-Frameworks, die große Mengen an nicht verwaltetem Speicher verwenden?

Antwort

5

Wenn es IDisposable implementiert, besteht eine sehr gute Chance, dass es nicht verwaltete Daten besitzt oder eine verwaltete Klasse besitzt, die letztendlich nicht verwaltete Daten besitzt. Wenn es Finalize() hat, ist es ein Zeichen, dass es direkt nicht verwaltete Daten besitzt.

Als Faustregel, wenn es implementiert IDisposable, dann Dispose() es, sobald Sie fertig sind.

+1

Korrigiert zu "IDisposable." Außerdem ist die zuverlässigere Regel, wenn sie einen Finalizer implementiert, sie besitzt fast sicher nicht verwaltete Daten. – bobbymcr

+1

In der Tat - die meisten 'IDisposable' Elemente * tun (direkt) nichts, was nicht verwaltet wird - aber sie ketten sich zu etwas, das * könnte *. Zum Beispiel gibt es ein "IDisposable" in Iterator-Blöcken - aber nichts nicht verwaltet. –

1

Soweit ich weiß, gibt es kein einziges Dokument, das beschreibt oder identifiziert, welche Klassen im Framework nicht verwaltete Ressourcen verwenden. Die MSDN-Dokumentation für die bestimmte Klasse möglicherweise, aber das würde erfordern, dass Sie bestimmte Klassen betrachten.

Insgesamt ist es eine sichere Sache, dass viele der Klassen irgendwann einige unmanaged Code verwenden. Beispielsweise sind viele Windows Forms-Steuerelemente einfach Wrapper um die Win32-Steuerelemente, sodass sie nicht verwaltete Ressourcen verwenden.

0

Sie müssen vorsichtig sein, wenn eine Klasse IDisposable implementiert. Dies bedeutet normalerweise die Verwendung von nicht verwalteten Ressourcen, die jedoch nicht auf Speicher beschränkt ist, sondern auch Dateihandles, Sockets usw.

Ein guter Indikator dafür ist, wenn die Klasse eine IntPtr verwendet.

Verwandte Themen