365 Stimmen

Was sind die Verwendungszwecke von "using" in C#?

Benutzer kokos antwortete die wunderbare Versteckte Eigenschaften von C# Frage mit dem Hinweis auf die using Stichwort. Können Sie das näher erläutern? Was sind die Verwendungszwecke von using ?

543voto

paulwhit Punkte 8349

Der Grund für die using Anweisung soll sicherstellen, dass das Objekt entsorgt wird, sobald es den Gültigkeitsbereich verlässt, und es ist kein expliziter Code erforderlich, um sicherzustellen, dass dies geschieht.

Wie in Die 'using'-Anweisung in C# verstehen (codeproject) y Verwendung von Objekten, die IDisposable implementieren (microsoft) konvertiert der C#-Compiler

using (MyResource myRes = new MyResource())
{
    myRes.DoSomething();
}

zu

{ // Limits scope of myRes
    MyResource myRes= new MyResource();
    try
    {
        myRes.DoSomething();
    }
    finally
    {
        // Check for a null resource.
        if (myRes != null)
            // Call the object's Dispose method.
            ((IDisposable)myRes).Dispose();
    }
}

C# 8 führt eine neue Syntax ein, die " Erklärungen verwenden ":

Eine using-Deklaration ist eine Variablendeklaration, der das Schlüsselwort using vorangestellt ist. Sie teilt dem Compiler mit, dass die deklarierte Variable am Ende des umschließenden Bereichs abgelegt werden soll.

Der äquivalente Code von oben würde also lauten:

using var myRes = new MyResource();
myRes.DoSomething();

Und wenn die Kontrolle den Bereich verlässt, der sie enthält (normalerweise eine Methode, aber es kann auch ein Codeblock sein), myRes entsorgt werden.

139voto

BlackTigerX Punkte 5824

Denn viele Menschen tun das immer noch:

using (System.IO.StreamReader r = new System.IO.StreamReader(""))
using (System.IO.StreamReader r2 = new System.IO.StreamReader("")) {
   //code
}

Ich glaube, viele Leute wissen immer noch nicht, dass man das tun kann:

using (System.IO.StreamReader r = new System.IO.StreamReader(""), r2 = new System.IO.StreamReader("")) {
   //code
}

101voto

Joel Coehoorn Punkte 377088

Dinge wie diese:

using (var conn = new SqlConnection("connection string"))
{
   conn.Open();

    // Execute SQL statement here on the connection you created
}

Diese SqlConnection wird geschlossen, ohne dass ein expliziter Aufruf der .Close() Funktion, und dies wird geschehen auch wenn eine Ausnahme ausgelöst wird ohne die Notwendigkeit eines try / catch / finally .

32voto

MagicKat Punkte 9409

mit kann zum Aufruf von IDisposable verwendet werden. Es kann auch für Alias-Typen verwendet werden.

using (SqlConnection cnn = new SqlConnection()) { /* Code */}
using f1 = System.Windows.Forms.Form;

24voto

Amanda Mitchell Punkte 2627

mit im Sinne von

using (var foo = new Bar())
{
  Baz();
}

Ist eigentlich eine Abkürzung für einen try/finally-Block. Er ist äquivalent zu diesem Code:

var foo = new Bar();
try
{
  Baz();
}
finally
{
  foo.Dispose();
}

Sie werden natürlich feststellen, dass der erste Ausschnitt viel prägnanter ist als der zweite und dass es viele Dinge gibt, die Sie als Bereinigung durchführen möchten, auch wenn eine Ausnahme ausgelöst wird. Aus diesem Grund haben wir eine Klasse entwickelt, die wir Umfang die die Ausführung von beliebigem Code in der Dispose-Methode ermöglicht. Wenn Sie zum Beispiel eine Eigenschaft namens IsWorking haben, die Sie immer auf false setzen wollen, nachdem Sie versucht haben, eine Operation auszuführen, würden Sie das so machen:

using (new Scope(() => IsWorking = false))
{
  IsWorking = true;
  MundaneYetDangerousWork();
}

Lesen Sie mehr über unsere Lösung und wie wir sie entwickelt haben aquí .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X