2016-12-05 1 views
-1

C# -Schlüsselwort Verwenden implementiert Idisposable, das einen Mechanismus für Freigabe nicht verwalteter Ressourcen bereitstellt.Verwenden von Schlüsselwörtern und verwaltete Unverwaltete Codes

nun durch diesen Code i wurde

string txt = String.Empty; 
     using (StreamReader sr = new StreamReader(filename)) { 
     txt = sr.ReadToEnd(); 
     } 

und kann nicht aufhören fragen, warum geht das Schlüsselwort Verwendung in diesem Code verwendet wird, während Stream verwaltete Ressource ist, und es liegt in der Verantwortung des Garbage Collectors, um den Speicher des Objekts freizugeben, nachdem sein Bereich überschritten wurde.

Also meine Frage ist,

  1. Ist der obige Code einfach eine explizite Weise
  2. Gemäß meinem Verständnis alle Methoden oder Klassen zu befreien Ressourcen Umgang, die wir unter dem .NET Framework verwenden, ist ein Managed Code, dann ist StreamReader auch nicht unter verwalteten Code.
  3. Fehle ich etwas auf dem verwalteten \ Unmanaged Code
+3

die '' StreamReader'' möglicherweise unter Verwendung werden in es Implementierung sind einige nicht verwalteten Ressourcen, so dass es stellen sicher, dass sie entsorgt werden, wenn sie mit –

+1

verpackt werden.In dem von Ihnen bereitgestellten Beispiel wäre dies das Dateihandle, mit dem die Datei zum Lesen geöffnet wird. – stuartd

+6

Datei-E/A ist ein betriebssystemspezifischer Dienst. In Windows wird ein Handle-Ansatz verwendet, Griffe müssen geschlossen werden. –

Antwort

-5

Ich denke, dies eher ein defensiven Programmierstil ist, wo ich als mit diesem Objekt verknüpfte Datei verwendet werden soll nicht der Strom Leser Objekt wollen hat wurde bereits vollständig mit ReadtoEnd-Funktion gelesen und wird von txt verwiesen.

+0

Dies ist nicht richtig. 'using' existiert, um garantiert (oder zumindest so nah wie möglich) und unverzügliche Bereinigung von nicht verwalteten Ressourcen zu gewährleisten. Es ist nicht nur ein Scoping-Mechanismus. – Servy

+0

Die Anforderung zum Lesen der Datei wurde von einer Betriebssystem-API erfüllt. Diese API erfordert eine Benachrichtigung, wenn die E/A abgeschlossen ist, um zugeordnete Ressourcen freizugeben. Wenn etwas IDisposable implementiert, disponiere es immer. –

1

warum ist das Schlüsselwort in diesem Code verwendet Verwendung während Stream eine Managed Ressource

ist Während Stream ein verwaltetes Objekt ist es Objekte im Inneren halten kann, die auf dem verwalteten Heap nicht zugeordnet werden. Garbage Collector hat keine Sichtbarkeit für ihre Zuordnung und kann sie daher nicht bereinigen. Für den speziellen Fall von StreamReader erstellt es intern einen FileStream (für Ihren speziellen Fall) der intern ein WIN32-Dateihandle erstellt und hält.

_handle = Win32Native.SafeCreateFile(tempPath, fAccess, share, secAttrs, mode, flagsAndAttributes, IntPtr.Zero); 

(-Code Reference)

using ist nur eine Abkürzung für:

try 
{ 
    var streamReader = new StreamReader(path); 
    // code 
} 
finally 
{ 
    streamReader.Dispose(); 
} 

Methoden Umsetzung IDisposable Notwendigkeit Dispose zu implementieren, wo sie die Möglichkeit erhalten, Datei-Handles, Steckdosen, oder eine solche in der Nähe Ressource, die möglicherweise manuell gereinigt werden muss.

Wenn man ein StreamReader innerhalb einer Klasse halten choses dann sollte diese Klasse IDisposable implementieren, korrekt auf den zum StreamReaderDispose passieren.

So ist die IDisposable kann als Vertrag für Klassen in Betracht gezogen werden, die entweder native Objekte halten, oder Objekte halten, die IDisposable implementieren

Verwandte Themen