Was versteht man unter den Begriffen verwaltete Ressource und nicht verwaltete Ressource in .NET? Wie kommen sie ins Bild?
Was versteht man unter den Begriffen verwaltete Ressource und nicht verwaltete Ressource in .NET? Wie kommen sie ins Bild?
Antworten:
Der Begriff "nicht verwaltete Ressource" wird normalerweise verwendet, um etwas zu beschreiben, das nicht direkt unter der Kontrolle des Garbage Collectors steht . Wenn Sie beispielsweise eine Verbindung zu einem Datenbankserver herstellen, werden Ressourcen auf dem Server (zum Aufrechterhalten der Verbindung) und möglicherweise andere Nicht-Netz-Ressourcen auf dem Clientcomputer verwendet, wenn der Anbieter nicht vollständig in verwaltetem Code geschrieben ist.
Aus diesem Grund wird für eine Datenbankverbindung empfohlen, den Code folgendermaßen zu schreiben:
using (var connection = new SqlConnection("connection_string_here"))
{
// Code to use connection here
}
Da dies sicherstellt, dass .Dispose()
das Verbindungsobjekt aufgerufen wird, wird sichergestellt, dass nicht verwaltete Ressourcen bereinigt werden.
In den Fragen und Antworten Was sind nicht verwaltete Ressourcen? 1 , Bruce Wood hat Folgendes gepostet:
Ich denke an die Begriffe "verwaltet" und "nicht verwaltet" auf diese Weise:
"Verwaltet" bezieht sich auf alles in der .NET-Sandbox. Dies umfasst alle .NET Framework-Klassen.
"Nicht verwaltet" bezieht sich auf die Wildnis außerhalb der .NET-Sandbox. Dies schließt alles ein, was Ihnen durch Aufrufe der Win32-API-Funktionen zurückgegeben wird.
Wenn Sie niemals eine Win32-API-Funktion aufrufen und niemals Win32-Handle-Objekte zurückerhalten, verfügen Sie nicht über nicht verwaltete Ressourcen. Dateien und Streams, die Sie über .NET Framework-Klassenmethoden öffnen, sind verwaltete Wrapper.
Kommentar: Möglicherweise halten Sie eine nicht verwaltete Ressource nicht direkt . Möglicherweise halten Sie jedoch eine nicht verwaltete Ressource indirekt über eine verwaltete "Wrapper-Klasse" wie System.IO.FileStream . Eine solche Wrapper-Klasse implementiert normalerweise IDisposable (entweder direkt oder über Vererbung).
... viele verwaltete (.NET Framework) Objekte enthalten nicht verwaltete Ressourcen, und Sie möchten diese wahrscheinlich so schnell wie möglich entsorgen () oder Ihren Anrufern zumindest die Möglichkeit dazu bieten. Hier kommt das Schreiben Ihrer eigenen Dispose () -Methode ins Spiel. Im Wesentlichen erledigt die Implementierung von IDisposable () zwei Dinge für Sie:
Ermöglicht das Entfernen von Ressourcen, die Sie direkt vom Betriebssystem hinter dem Rücken von .NET abgerufen haben (nicht verwaltete Ressourcen).
Ermöglicht es Ihnen und Ihren Anrufern, umfangreiche .NET-Objekte / .NET-Objekte freizugeben, die wertvolle Ressourcen in ihren schmutzigen kleinen Händen halten, die Sie / Ihre Anrufer jetzt freigeben möchten .
Kommentar: Durch die Implementierung IDisposable
und damit Bereitstellung einer Dispose()
Methode ermöglichen Sie einem Benutzer Ihrer Klasse, nicht verwaltete Ressourcen, die von einer Instanz Ihrer Klasse gehalten werden, deterministisch freizugeben .
1 Link, der ursprünglich in Sachin Shanbhags Antwort geteilt wurde . Zitiertes Material vom 17.11.2005. Beachten Sie, dass ich den zitierten Inhalt leicht kopiert habe.
Der grundlegende Unterschied zwischen einer verwalteten und einer nicht verwalteten Ressource besteht darin, dass der Garbage Collector alle verwalteten Ressourcen kennt. Zu einem bestimmten Zeitpunkt wird der GC den gesamten Speicher und die Ressourcen bereinigen, die einem verwalteten Objekt zugeordnet sind. Der GC kennt nicht verwaltete Ressourcen wie Dateien, Streams und Handles nicht. Wenn Sie sie also nicht explizit in Ihrem Code bereinigen, treten Speicherlecks und gesperrte Ressourcen auf.
Weitere Informationen finden Sie unter http://bytes.com/topic/c-sharp/answers/276059-what-unmanaged-resources