Unterschied zwischen 'using' und scoping?

7

Was ist der Unterschied zwischen den folgenden zwei Codeschnipsel:

%Vor%

und

%Vor%

Ich habe angefangen, using viel mehr zu verwenden, aber ich bin neugierig, was die tatsächlichen Vorteile im Vergleich zu Scoping-Objekten sind.

Bearbeiten: Nützliche Leckerbissen, die ich daraus gezogen habe:

Jon Skeet:

  

Beachten Sie, dass dies die Garbage Collection in keiner Weise, Form oder Form erzwingt. Müllsammlung und schnelle Ressourcenbereinigung sind etwas orthogonal.

Wird Eddins kommentieren:

  

Sofern Ihre Klasse die IDisposable-Schnittstelle nicht implementiert und über eine Dispose () - Funktion verfügt, verwenden Sie nicht die Verwendung von.

    
Kelsey 30.10.2009, 16:13
quelle

5 Antworten

20

Das erste Snippet ruft Dispose am Ende des Blocks auf - Sie können nur mit Typen arbeiten, die IDisposable implementieren, und es ruft im Grunde Dispose in einem finally-Block auf, so dass Sie es mit Typen verwenden können, die Ressourcen müssen aufgeräumt werden, zB

%Vor%

Beachten Sie, dass not die Garbage Collection in irgendeiner Form oder Form erzwingt. Müllsammlung und schnelle Ressourcenbereinigung sind etwas orthogonal.

Im Grunde genommen sollten Sie eine using -Anweisung für so ziemlich alles verwenden, was IDisposable implementiert und wofür Ihr Code-Block die Verantwortung übernehmen wird (hinsichtlich der Bereinigung).

    
Jon Skeet 30.10.2009, 16:15
quelle
3

Am Ende von using wird das Objekt entsorgt (das Objekt, das Sie in die Klammer setzen, muss IDisposable implementieren). Das Objekt wird auch in Ausnahmefällen entsorgt. Und Sie müssen nicht auf den GC warten, um es irgendwann zu tun (Sie kontrollieren es).

BEARBEITEN: Der Nachteil des Bereichs ist:

  • Sie steuern nicht die Disposition des Objekts
  • Selbst wenn Sie am Ende Ihres Geltungsbereichs "dispose" aufrufen würden, wäre es nicht ausnahmslos sicher
jdehaan 30.10.2009 16:15
quelle
3

Nur um den Unterschied buchstäblich zu zeigen ...

%Vor%

ist dasselbe wie ...

%Vor%

wo wie

%Vor%

ist wie es ist.

    
Sekhat 30.10.2009 16:55
quelle
1

Siehe die Dokumentation zu IDisposable und die Freigabe von Ressourcen für bestimmte Ressourcen.

Einfach gesagt, am Ende des Blocks using{} können Sie verlässlich über zugewiesene Ressourcen verfügen (z. B. Dateihandles schließen, Datenbankverbindungen usw.)

    
Brian Agnew 30.10.2009 16:16
quelle
0

using erfordert nur eine Implementierung der IDisposable-Schnittstelle und ruft die Dispose-Methode am Ende des Bereichs auf.

Für viele tobende Argumente über die ordnungsgemäße Entsorgung von Objekten gibt es viele andere Threads.

    
Mister Bee 30.10.2009 16:18
quelle

Tags und Links