Frage

    

Diese Frage bereits eine Antwort hier:

         

Gibt es bestimmte Fälle, in denen ich sollte (oder sollte nicht?) Werden unter Verwendung von Blöcken „mit“:

using(SomeType t = new SomeType()){
    ...
}
War es hilfreich?

Lösung

Wenn die SomeType Klasse implementiert IDisposable .

Andere Tipps

Einige Objekte müssen einige Maßnahmen ergriffen werden, wenn Sie mit ihnen fertig sind. Normalerweise ist dies, weil das Objekt eine Art von Ressource verwendet, die entsorgt werden muss. Zum Beispiel, wenn Sie eine Datei Objekt der Klasse Datei haben, und dieses Objekt öffnet eine Datei aus dem Dateisystem, wird die Datei im Dateisystem muss wieder geschlossen werden.

Wenn Sie nur die Datei-Objekt verlassen und vergessen file.Close () aufzurufen es nicht, bis die Garbage Collector aufgeräumt würde (GC) lief und arbeitete nichts war noch das Dateiobjekt verwenden. Wenn die Garbage Collector läuft sollte die Common Language Runtime (CLR) überlassen werden, zu entscheiden. Wenn der GC nicht für eine ganze Weile laufen, nachdem Sie mit der Datei fertig sind, könnte die Datei möglicherweise für längere Zeit offen bleiben. Dies kann ein großes Problem darstellen, wenn es viele Dateiobjekte sind, oder wenn etwas will eine Datei öffnen, kann aber nicht, weil die Datei Objekt, das Sie noch übrig ist rumhängen.

Um dieses Problem zu lösen, hat C # die IDisposable-Schnittstelle. Dies hat eine Methode namens entsorgen. Klassen, die eine gewisse Bereinigung implementieren diese Methode Dispose erfordern. Dies gibt Ihnen einen Standard für alle Objekte, Reinigung, die Ressourcen verwenden. Es gibt eine Menge von Klassen, die müssen genannt haben entsorgen. Das Problem dabei ist, dass Code wird mit Anrufen abgedeckt Verfügungs, und sie sind schwierig, weil der Ort zu folgen, wo Sie das Objekt und rufen Entsorgen new'ed es zu bereinigen, sind unterschiedlich. So hatte man viel um den Code zu sehen und sehr vorsichtig sein, um zu überprüfen dort Anrufe an der richtigen Stelle zu entsorgen waren.

Um dieses Problem zu lösen, C # eingeführt, um das ‚mit‘ Schlüsselwort. Sie können ein ‚mit‘ Schlüsselwort setzen um, wo Sie ein Objekt neu, und dies gewährleistet wird entsorgen für Sie es aufgerufen werden. Es garantiert, dass Dispose aufgerufen wird, egal was passiert ... auch wenn es eine Ausnahme innerhalb des Körpers der anwende Aussage geworfen ist.

Also, sollten Sie ‚verwenden‘, wenn Sie ein Objekt sicher sein wollen, die Ressourcen zuteilt werden gereinigt.


verwenden, kann nur für Objekte verwendet werden, die auf dem Stapel, das heißt in einer Funktion deklariert werden. Es funktioniert nicht für Objekte, die als Mitglieder einer Klasse deklariert werden. Für sie müssen Sie sich selbst entsorgen nennen. Möglicherweise müssen Entsorgen in Ihrer Klasse implementieren, so dass in Dispose aufrufen können auf jedes Mitglied Objekte hat, die sie benötigen.


Gemeinsame Objekte, die auf sie berufen müssen verwenden: Dateien, Datenbankverbindungen, Grafikobjekte wie Stift und Pinsel

.

Manchmal wird es auch verwendet, wenn Sie zwei Operationen wollen gemeinsam geschehen. Zum Beispiel, wenn Sie eine Log-Anweisung, wenn ein Block von Code schreiben eingegeben wird und wenn es beendet könnten Sie eine Log-Klasse schreiben, die Sie wie folgt verwenden können:

using( Log log = new Log("Doing stuff") )
{
    // Stuff
}

Der Konstruktor für die Log-Klasse kann die Nachricht zu schreiben, gemacht werden, und die Dispose-Methode könnte auch schreiben. Implementieren Sie die Finalizerthread (~ Log) geltend zu machen, wenn die Dispose-Methode nicht, um sicherzustellen, genannt bekommt die ‚Verwendung‘ um den ‚neuen Log‘ erinnert.

Verwenden Sie using , wenn die Art implementiert IDisposable , wenn Sie sie wickeln in einem try / catch sowieso blockieren, dann könnten Sie auch (je nachdem, was suchen Sie bevorzugen) verwenden ein < a href = "http://msdn.microsoft.com/en-us/library/dszsf989.aspx" rel = "noreferrer"> finally Block.

Ich sehe viele weitere Antworten angezeigt, wenn Sie sollte eine using Äußerung. Ich möchte adressieren, wenn speziell sollte nicht hat eine using Anweisung:

Wenn Sie außerhalb des Bereichs der aktuellen Funktion verwenden, um Ihr Objekt benötigen, keinen using Block hat. Gutes Beispiel ist eine Fabrik-Methode, die eine Datenbankverbindung oder eine Methode gibt, die einen Datareader zurückgeben muß. In jedem dieser Fälle, wenn Sie Ihr Objekt mit einer using Anweisung erzeugen würde es entsorgt werden, bevor das Verfahren zurückgegeben wird, und daher nicht verwendbar außerhalb des Verfahrens.

Jetzt wollen Sie noch auf sicher , dass diese Objekte angeordnet sind, so dass Sie immer noch eine using Aussage irgendwo wünschen könnte. Nur lassen Sie es in dem Verfahren, in dem das Objekt tatsächlich erstellt wird. Stattdessen können Sie den Funktionsaufruf selbst in einer using Anweisung wickeln.

Wenn Sometype IDisposable implementiert.

Das ist ein Hinweis auf Sie den Entwickler, die Sometype nicht verwalteten Ressourcen verwendet, die bereinigt werden müssen.

Beispiel:

        using(SqlConnection MyConnection = new SqlConnection("Connection string"))
        {
            MyConnection.Open();

            //...

            // 1. SQLConnection is a type that implements IDisposable
            // 2. So you can use MyConnection in a using statement
            // 3. When using block finishes, it calls Dispose method of 
            // SqlConnection class
            // 4. In this case, it will probably close the connection to 
            // the database and dispose MyConnection object

        }

Sie können eigene Objekte erstellen, die IDisposable implementiert:

public class MyOwnObjectThatImplementsIDisposable : IDisposable
{

    //... some code

    public void Dispose()
    {
        // Put here the code you want to be executed when the
        // using statement finish.
    }
}

So ein Objekt von MyOwnObjectThanImplementsIDisposable Typ in einer using-Anweisung verwenden:

        using(MyOwnObjectThatImplementsIDisposable MyObject = new MyOwnObjectThatImplementsIDisposable)
        {

            // When the statement finishes, it calls the 
            // code you´ve writed in Dispose method
            // of MyOwnObjectThatImplementsIDisposable class
        }

Hope, das hilft

In diesem Zusammenhang ist die using Aussage ist praktisch für Typen, die IDisposable implementieren. Wenn der Codeblock, den Umfang der using Anweisung beendet wird, wird Dispose() implizit aufgerufen. Es ist eine gute Gewohnheit, wenn sie mit Objekten arbeiten Sie sofort nach Gebrauch entsorgen wollen.

Eine spezifische Instanz, in der man vorsichtig sein sollte, einen using Block verwendet, ist mit einem WCF-Service-Client .

Wie bereits erwähnt in dieser MSDN-Artikel , Umwickeln eines WCF-Client (die tun IDisposable implementieren) in einem Block using könnten Fehler maskieren, die in der Client-Folge in einem fehlerbehafteten Zustand befindet, nach links (wie ein Timeout oder Kommunikationsproblem). Lange Rede kurzer Sinn, wenn Dispose() genannt wird, die Close() Methode Feuer des Kunden, sondern wirft und Fehler, weil es in einem fehlerhaften Zustand. Die ursprüngliche Ausnahme wird durch die zweite Ausnahme dann maskiert. Nicht gut.

Es gibt verschiedene Abhilfen gibt, darunter eine in dem MSDN-Artikel selbst. Andere können unter IServiceOriented und blog.davidbarret.net .

Ich ziehe die letzte Methode, selbst.

Wenn Sie eine Zusammenfassung der Regel wollen. Immer wenn ein Objekt mit IDisposable, wo man nicht einen Haken haben würde, verwenden verwenden. Mit im Wesentlichen wissen, ist dieses Muster:

try
{
  //instantiate and use object
}
finally
{
  //dispose object
}

Wenn Sie nicht einen Haken benötigen, verwenden sparen können eingeben Sie, was eine gute Sache ist.

Die wichtigste Regel ist:       * Verwenden Sie USING-Anweisung, wenn Objekte IDisposable-Schnittstelle implementiert.

Diese Schnittstelle stellt die Dispose-Methode, die das Objekts Ressourcen freigeben sollte. Wenn diese Methode nicht aufgerufen wird, dann wird das Objekt im Speicher so lange bleiben, wie CLR will Speicherbereinigungs auszuführen. Wenn der Programmierer die Anweisung using dann am Ende verwendet, wird das Objekt angeordnet werden, und alle Ressourcen werden frei sein.

Es ist sehr wichtig, dass alle Ressourcen, die nicht mehr in Gebrauch ist so schnell wie möglich frei sein.

Für weitere Informationen über sie gerade diesen Link: microsoft

Vielleicht ist es erwähnenswert, dass Grund für den Zusatz „mit“ lo C # languge folgt: einige Ressourcen genug knapp sein können, dass es nicht sinnvoll, wartet nicht machen für GC IDisposable zu nennen. Zum Beispiel DB-Verbindungen. Wenn Sie try / catch verwenden / schließlich werden Sie nicht mit einer baumelnden Verbindung beenden, aber Verbindung wird hängen gelassen werden, bis GC nicht in nicht treten und dies kann eine Weile dauern (wenn Sie es nicht explizit schließen). WENN Sie „verwenden“ (entschuldigen Sie das Wortspiel) verwenden lösen Sie die Verbindung sofort, auch wenn Sie es schließen vergessen und auch wenn einige Ausnahme in der Verwendung von Block aufgetreten.
Ein weiterer Grund, wie frühere Post erwähnt, ist, dass Programmierer nicht immer schließlich bis zu reinigen. Wenn nicht endlich im Fall ausnahmsweise mit Sie am Ende mit Ressourcen undichten ...

Eine Situation ist, wenn man etwas am Anfang eines Codeblockes tun will, und dann am Ende des Blockes rückgängig zu machen, unbedingt (auch wenn es ein Wurf).

Der Ctor für die Einweg-Klasse, die Sie bauen (und rufen Sie in der Verwendung) würden die Aktion durchführen, und dann würde die Dispose-Methode, dass die Aktion rückgängig zu machen. Dies ist in der Regel, wie ich es verwenden.

Andere Leute erwähnt über "IDisposable" bereits.

Aber eine der Einschränkungen bei der Verwendung von „using“ Aussage ist, dass, Ausnahmen geworfen innerhalb „mit“ nicht gefangen werden dachte sogar, „Sometype“ unabhängig angeordnet werden.

So im folgenden Ausschnitt,

using (SomeType t = new SomeType()){
    throw new Exception("thrown within using");
}

throw new Exception("thrown within using"); sollte nicht außer Acht gelassen werden.

Ich möchte auch hinzufügen, dass eine using() Anweisung verwenden, wenn IDispose etwas implementiert und auch wenn das etwas, was Sie wollen entsorgen hält auf nicht verwalteten Ressourcen wie Datenbankverbindungen und Datei-Handles.

Wenn es ein normales Objekt ist mit einem List<T> sagen, wobei T wie ein Customer Objekt ist, das Name und Adresse hält, dann nicht, Sie brauchen. Der Garbage Collector ist intelligent genug, um dies für Sie zu verwalten. Aber die Garbage Collector wird nicht zurückkehren Verbindungen an den Verbindungspool oder in der Nähe Datei-Handles.

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