Was ist die Beziehung zwischen der Verwendung von Keyword und der IDisposable-Schnittstelle?
-
30-09-2019 - |
Frage
Wenn ich das using
Stichwort verwenden, muß ich noch IDisposable
implementieren?
Lösung
Wenn Sie die Verwendung using
Anweisung die gekapselten implementieren muss bereits IDisposable
sonst der Compiler Ausgabe ein Fehler. So IDisposable Implementierung erwägen eine Voraussetzung sein zu verwenden.
Wenn Sie die using
Aussage über Ihre benutzerdefinierte Klasse verwenden möchten, dann müssen Sie IDisposable
für sie umzusetzen. Allerdings ist diese Art von rückwärts zu tun, weil es keinen Sinn ist so im Interesse der es zu tun. Nur wenn Sie etwas zu entsorgen, wie eine nicht verwaltete Ressource sollten Sie es implementieren.
// To implement it in C#:
class MyClass : IDisposable {
// other members in you class
public void Dispose() {
// in its simplest form, but see MSDN documentation linked above
}
}
Damit können Sie:
using (MyClass mc = new MyClass()) {
// do some stuff with the instance...
mc.DoThis(); //all fake method calls for example
mc.DoThat();
} // Here the .Dispose method will be automatically called.
effektiv das ist das gleiche wie das Schreiben:
MyClass mc = new MyClass();
try {
// do some stuff with the instance...
mc.DoThis(); //all fake method calls for example
mc.DoThat();
}
finally { // always runs
mc.Dispose(); // Manual call.
}
Andere Tipps
Sie können nicht eine ohne das andere.
Wenn Sie schreiben:
using(MyClass myObj = new MyClass())
{
myObj.SomeMthod(...);
}
Compiler so etwas wie dies generieren:
MyClass myObj = null;
try
{
myObj = new MyClass();
myObj.SomeMthod(...);
}
finally
{
if(myObj != null)
{
((IDisposable)myObj).Dispose();
}
}
So wie Sie sehen können, während mit using
es Schlüsselwort wird angenommen, / erforderlich, dass IDisposable implementiert ist.
Sie sind verwirrend Dinge. Sie können nur die „mit“ Schlüsselwort auf etwas, das implementiert IDisposable verwenden.
Edit: Wenn Sie die Verwendung von Keyword verwenden, müssen Sie nicht auf explicity invoke entsorgen, wird es automatisch am Ende der using-Blöcke aufgerufen werden. Andere haben bereits Beispiele veröffentlicht, wie die using-Anweisung in einem Try übersetzt - schließlich Anweisung, mit Dispose aufgerufen die schließlich im Block
.Ja, die Verwendung von Keyword ist syntaktischer Zucker für diese Art von Muster ... (von Msdn)
Font font1 = new Font("Arial", 10.0f);
try
{
byte charset = font1.GdiCharSet;
}
finally
{
if (font1 != null)
((IDisposable)font1).Dispose();
}
Edit: a. Nützliches Beispiel
Wenn Sie finden Sie die Dinge in einem endlich Abschnitt tun consistantly, beispielsweise einen Cursor zurück auf den Standard Zurücksetzen nachdem es auf einen Wartecursor gesetzt zu haben, das ist ein Kandidat für dieses Muster ...
public class Busy : IDisposable
{
private Cursor _oldCursor;
private Busy()
{
_oldCursor = Cursor.Current;
}
public static Busy WaitCursor
{
get
{
Cursor.Current = Cursors.WaitCursor;
return new Busy();
}
}
#region IDisposable Members
public void Dispose()
{
Cursor.Current = _oldCursor;
}
#endregion
}
Wird aufgerufen, wie ...
using(Busy.WaitCursor)
{
// some operation that needs a wait cursor.
}
Mit nur entsorgen Einweg Objekte. So wraping unter Verwendung eines Block um ein Objekt, das nicht IDisposable nicht implementiert ist ziemlich nutzlos wird in der Tat Ursache einen Compiler-Fehler.
http://msdn.microsoft.com/en-us/library /yh598w02.aspx
In der Regel, wenn Sie eine IDisposable verwenden Objekt, sollten Sie erklären und instanziiert es in einer using-Anweisung. Die Verwendung Anweisung ruft die Dispose Methode für das Objekt in der richtigen Art und Weise, und es verursacht auch das Objekt sich so schnell von Umfang zu gehen als Entsorgen Sie wird aufgerufen. Innerhalb der Verwendung Block wird das Objekt schreibgeschützt und kann nicht geändert oder neu zugewiesen werden.
Die using-Anweisung stellt sicher, dass Entsorgen wird, selbst wenn eine Ausnahme genannt auftritt, während Sie Methoden aufrufen auf dem Objekt. Sie können das erreichen gleiches Ergebnis durch das Objekt, in einem Try-Block und dann Aufruf Entsorgen in einem schließlich blockieren; eigentlich, Dies ist, wie die using-Anweisung ist vom Compiler übersetzt.
Sie müssen IDisposable implementieren mit zu verwenden. Wenn Sie versuchen, () auf eine Art zu verwenden, verwenden, die nicht IDisposable nicht implementiert Sie die folgende Kompilierung Fehler:
error CS1674: 'SomeType': type used in a using statement must be implicitly convertible to 'System.IDisposable'
Die Verwendung von Keyword bereits implementiert, so dass, wenn Sie die Verwendung von Keyword verwenden, müssen Sie nicht auf invoke IDisposable