Frage

Wenn ich das using Stichwort verwenden, muß ich noch IDisposable implementieren?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top