Ich bin etwas neu in c #, eher an Skriptsprachen gewöhnt. Ich mag die Idee des "Verwendens", man instanziiert ein Objekt, und dann operierst du in seinem Umfang, solange du es brauchst, dann lässt du es sich selbst überlassen, wenn es seinen Zweck erfüllt hat.
Aber es ist nicht natürlich für mich. Wenn Leute mir Beispiele zeigen, die es benutzen, erkenne ich, dass es ein gutes Werkzeug für den Job ist, aber es fällt mir nie ein, Probleme damit in meiner eigenen Programmierung zu lösen.
Wie kann ich gute Orte erkennen, um using
zu benutzen und wie benutze ich sie in Verbindung mit try-catch-Blöcken? Gehen sie in den Block oder möchten Sie normalerweise eine using-Anweisung in einen try-Block einschließen?
Ich schreibe selten "try / catch" -Blöcke - die meisten Ausnahmen werden auf (fast) ganz oben im Stapel geworfen. Wenn ich einen try / catch-Block brauche, bin ich mir nicht sicher, ob ich besonders konsequent darin bin, ihn in die using
-Anweisung vs. außerhalb zu setzen. Es hängt wirklich davon ab, ob die Ressource vor oder nach dem Ausführen des Ausnahmebehandlungscodes entfernt werden soll.
Wenn Sie nach fragen, wenn Sie using
-Anweisungen schreiben sollten - jedes Mal, wenn Sie ein Objekt "besitzen", das IDisposable
(entweder direkt oder indirekt durch Vererbung) implementiert und dessen steuert Lebenszeit. Dies ist normalerweise ein Objekt, das eine nicht verwaltete Ressource wie ein Dateihandle oder eine Netzwerkverbindung verwendet. Es ist nicht immer sehr offensichtlich, aber Sie lernen durch Erfahrung. Fast alles , was mit IO zu tun hat, wird wegwerfbar sein, und Windows-Handles (für Fonts usw.) sind ähnlich.
using
kann nur mit Typen verwendet werden, die IDisposable
implementieren; Es garantiert, dass die Methode Dispose()
aufgerufen wird, auch wenn ein Fehler auftritt.
Dieser Code:
%Vor%entspricht dem:
%Vor%Ich denke immer daran: "Benutze es jedes Mal, wenn Typ IDisposable implementiert und du nicht mehr brauchst, um diese bestimmte Instanz zu benötigen."
Wenn Sie wissen möchten, wie Sie es kreativ in Ihren eigenen Entwürfen verwenden können, sehen Sie sich Ihren eigenen Code für Situationen an, in denen ein bestimmter Code unbedingt ausgeführt werden muss, bevor der umschließende Block beendet wird. Dies sind die Situationen, in denen try
/ finally
oder using
Ihnen helfen können.
Insbesondere wenn Sie dies versucht haben, indem Sie alle Ausnahmen erfasst haben, müssen Sie stattdessen wirklich zu try
/ finally
oder using
wechseln.
Wenn das Muster mehrmals auftritt, können Sie eine Klasse erstellen, die IDisposable
implementiert, um das Muster zu erfassen, und Sie können das Muster mit der using
-Anweisung aufrufen. Aber wenn Sie einen bestimmten Fall haben, der einmalig zu sein scheint, verwenden Sie einfach try
/ finally
.
Die beiden sind sehr ähnlich, wirklich - using
wird in try
/ finally
angegeben, aber selbst wenn wir nur using
hätten, könnten wir try
/ finally
selbst erstellen:
Jetzt könnte man sagen:
%Vor%Was ist das gleiche wie:
%Vor%Stellen Sie sich einfach vor, wie Code beim Ausführen eines Bereichs ausgeführt werden soll.
Was Mitch sagte, plus ..
Sie können mit der Anweisung using außerhalb oder innerhalb eines try..catch Block wäre es wirklich davon ab, was Sie versuchen, dh zu erreichen, ob man vernünftigerweise erwarten, etwas eine Ausnahme während der Nutzung ein bestimmtes Objekt zu werfen, die Sie planen, zu erholen zum Beispiel.
Aus dem gleichen Grunde können Sie auch ein Objekt entsorgen, die IDisposable in einem finally implementiert blockieren, wenn Sie benötigt werden.
Sie können eine Verwendung in einen try / catch-Block einschließen, und Sie können einen try / catch-Block in einer using einschließen.
Eine Situation, in der die Verwendung sinnvoll ist, ist, wenn Sie Datenbankoperationen mit DBConnection und DBCommands durchführen:
%Vor%Wenn Sie nun die verwendeten Blöcke verlassen, wird Ihr Befehl aufgehoben und die Verbindung geschlossen.
Was Mitch gesagt hat, ist richtig. Der Haupteinsatz von using besteht also darin, sicherzustellen, dass IDisposable-Objekte entsorgt werden, ohne eine try / catch- oder try / finally-Anweisung zu codieren.
Jetzt gibt es einen fortgeschritteneren Gebrauch, den Sie vielleicht auch interessant finden könnten. Wenn Sie eine using-Anweisung verwenden, generiert der Compiler try / finally und generiert außerdem einen Aufruf an Dispose () für Sie innerhalb der schließlich generierten Anweisung. Sie können diese Dispose () -Methode als "Hook" verwenden, um alles zu tun, was Sie wollen ... muss nicht mit der Freigabe von Ressourcen in Verbindung stehen.
Jeffrey Richter verwendet dies zum Beispiel in einem Timer-Objekt, das er geschrieben hat. Sie können so etwas damit machen (nur konzeptionell):
%Vor%Wenn eine Klasse IDisposable implementiert, ist das wahrscheinlich ein guter Grund. Daher sollte jede Klasse, die IDisposable implementiert, entsorgt werden.
Wenn man bedenkt, dass es sich um "syntaktischen Zucker" handelt und dieselbe IL wie ein Konstrukt zum Versuch / zum Schluss erzeugen wird, ist es wirklich nur eine nette Art, solchen Code "kurz zu übergeben".
Ich benutze es gerne, um Codeabschnitte zu vereinfachen, in denen wegwerfbare Objekte sehr häufig verwendet werden, dh Zugriff auf Ressourcen wie Dateien und Grafikobjekte, und ich möchte sicherstellen, dass ich nicht vergesse, die Entsorgung des Ressourcenobjekts zu übernehmen .
Verwenden Sie mit , wenn Sie eine deterministische Objektentsorgung benötigen. Wenn Sie beispielsweise eine Datei öffnen, ist die Datei gesperrt. Oft möchten Sie, dass die Datei so schnell wie möglich geschlossen wird, damit andere Programme darauf zugreifen können. Wenn Sie nicht mit verwenden und "etw" schreiben:
%Vor%und während "do smth" tritt eine Ausnahme auf. Sie wissen nicht, wann die Objekte in einer Datei tatsächlich entsorgt werden und die Datei geschlossen wird. Mit using wissen Sie sicher, dass das Objekt in der Anweisung using entweder direkt oder über eine Ausnahme ist, wenn Sie den Anweisungsblock verlassen haben entsorgt durch Aufruf von IDisposable :: Dispose:
%Vor%Ich habe bemerkt, dass, wenn bekannt ist, dass die Dispose-Methode bemerkt, Programmierer sie nicht nennen, da es sinnlos erscheint. Wenn das Objekt IDisposable implementiert, ist es (hoffentlich) aus einem bestimmten Grund, und zukünftige Versionen dieses Objekts haben möglicherweise Code in der Dispose-Methode - also rufen Sie es immer auf.
Tags und Links c# using-statement