using-Anweisung (C#-Referenz)

Aktualisiert: Juli 2008

Stellt eine intuitive Syntax bereit, die die richtige Verwendung von IDisposable-Objekten sicherstellt.

Beispiel

Das folgende Beispiel veranschaulicht die Verwendung der using-Anweisung.

using (System.IO.StreamReader sr = new System.IO.StreamReader(@"C:\Users\Public\Documents\test.txt"))
{
    string s = null;
    while((s = sr.ReadLine()) != null)
    {
        Console.WriteLine(s);
    }
}

Hinweise

File und Font sind Beispiele für verwaltete Typen, die auf nicht verwaltete Ressourcen zugreifen (in diesem Fall Dateihandles und Gerätekontexte). Es gibt viele andere Arten von nicht verwalteten Ressourcen und Klassenbibliothekstypen, die sie kapseln. Alle diese Typen müssen die IDisposable-Schnittstelle implementieren.

Wenn Sie ein IDisposable-Objekt verwenden, sollten Sie es grundsätzlich deklarieren und in einer using-Anweisung instanziieren. Die using-Anweisung ruft die Dispose-Methode für das Objekt auf die richtige Weise auf und (bei Verwendung wie oben gezeigt) verursacht, dass das Objekt seinen Gültigkeitsbereich verlässt, sobald Dispose aufgerufen wird. Innerhalb des using-Blocks ist das Objekt schreibgeschützt und kann nicht geändert oder neu zugewiesen werden.

Mit der using-Anweisung wird sichergestellt, dass Dispose auch aufgerufen wird, wenn ein Ausnahmefehler auftritt, während Sie Methoden für das Objekt aufrufen. Sie erzielen dasselbe Ergebnis, indem Sie das Objekt in einen try-Block einfügen und Dispose in einem finally-Block aufrufen. Auf diese Weise wird die using-Anweisung vom Compiler übersetzt. Der Code im oben gezeigten Beispiel wird bei der Kompilierung auf folgenden Code erweitert (beachten Sie die zusätzlichen geschweiften Klammern zur Erstellung des begrenzten Gültigkeitsbereichs für das Objekt):

{
  Font font1 = new Font("Arial", 10.0f);
  try
  {
    byte charset = font1.GdiCharSet;
  }
  finally
  {
    if (font1 != null)
      ((IDisposable)font1).Dispose();
  }
}

In einer using-Anweisung können mehrere Objekte verwendet werden. Diese müssen allerdings wie im folgenden Beispiel innerhalb der using-Anweisung deklariert werden:

using (Font font3 = new Font("Arial", 10.0f),
            font4 = new Font("Arial", 10.0f))
{
    // Use font3 and font4.
}

Sie können das Ressourcenobjekt instanziieren und die Variable dann an die using-Anweisung übergeben, dies empfiehlt sich jedoch nicht. In diesem Fall bleibt das Objekt im Gültigkeitsbereich, wenn das Steuerelement den using-Block verlässt, auch wenn es möglicherweise keinen Zugriff mehr auf die nicht verwalteten Ressourcen hat. In anderen Worten, es wird nicht mehr vollständig initialisiert. Wenn Sie versuchen, das Objekt außerhalb des using-Blocks zu verwenden, riskieren Sie, dass eine Ausnahme ausgelöst wird. Aus diesem Grund sollten Sie das Objekt in der using-Anweisung instanziieren und den Gültigkeitsbereich auf den using-Block beschränken.

Font font2 = new Font("Arial", 10.0f);
using (font2) // not recommended
{
    // use font2
}
// font2 is still in scope
// but the method call throws an exception
float f = font2.GetHeight(); 


C#-Programmiersprachenspezifikation

Weitere Informationen finden Sie in den folgenden Abschnitten von C#-Programmiersprachenspezifikation:

  • 5.3.3.17 Using-Anweisungen

  • 8.13 Die using-Anweisung

Siehe auch

Konzepte

C#-Programmierhandbuch

Implementieren einer Dispose-Methode

Referenz

C#-Schlüsselwörter

using-Direktive (C#-Referenz)

Implementieren der Methoden "Finalize" und "Dispose" zum Bereinigen von nicht verwalteten Ressourcen

Weitere Ressourcen

C#-Referenz

Garbage Collection

Änderungsverlauf

Date

Versionsgeschichte

Grund

Juli 2008

Hinzugefügtes Codebeispiel nach der Einführung.

Korrektur inhaltlicher Fehler.