Verwenden von 'Verwenden' für andere Dinge als das Löschen von Ressourcen [duplizieren]

8

Wir alle wissen, dass die using -Anweisung wirklich gut für Ressourcen ist, die Sie rechtzeitig bereinigen möchten, z. B. eine geöffnete Datei- oder Datenbankverbindung.

Ich habe mich gefragt, ob es eine gute Sache wäre, die Anweisung in Fällen zu verwenden, in denen die Ressourcenbereinigung nicht das Ziel der Methode Dispose() ist, sondern eher in einen vorherigen Zustand zurückkehrt.

Zum Beispiel eine Klasse, die es einer using-Anweisung erlaubt, eine Prozedur zu umbrechen, die merklich lange dauert und den Cursor in einen Wartezustand versetzt.

%Vor%

Dann kann die Klasse als solche verwendet werden, ohne sich Gedanken über das Zurücksetzen des Cursors machen zu müssen, wenn Sie fertig sind.

%Vor%

Ist dies eine angemessene Verwendung der using -Anweisung?

    
Cemafor 29.05.2013, 13:31
quelle

5 Antworten

5

Es gibt sicherlich Präzedenzfälle für (ab) die using -Anweisung auf diese Weise zu verwenden, zum Beispiel FormExtensions.BeginForm im ASP.NET MVC-Framework. Dadurch wird ein <form> schließendes Tag zurückgegeben, wenn es entfernt wird, und der Hauptzweck besteht darin, in MVC-Ansichten eine knappe Syntax zu aktivieren. Die Dispose -Methode versucht, das schließende Tag auch dann darzustellen, wenn eine Ausnahme ausgelöst wird, was etwas seltsam ist: Wenn beim Rendern eines Formulars eine Ausnahme ausgelöst wird, möchten Sie wahrscheinlich nicht versuchen, das End-Tag zu rendern.

Ein weiteres Beispiel ist die NDC.Push Methode, die jetzt veraltet ist das log4net-Framework, das ein IDisposable zurückgibt, dessen Zweck es ist, den Kontext zu öffnen.

Einige Puristen würden sagen, dass es ein Missbrauch ist, ich schlage vor, dass Sie von Fall zu Fall Ihr eigenes Urteil fällen. Persönlich sehe ich nichts falsch mit Ihrem Beispiel für das Rendern eines Sanduhrcursors.

Die Diskussion, die in einem Kommentar von @ I4V verlinkt ist, hat einige interessante Meinungen - einschließlich Argumente gegen diese Art von "Missbrauch" von dem allgegenwärtigen Jon Skeet.

    
Joe 29.05.2013, 13:34
quelle
5

In Wirklichkeit ist using einfach syntaktischer Zucker für try/finally , also warum tust du es nicht einfach alt / endlich wie unten ...

%Vor%

Das Implementieren der Dispose -Methode zum Zurücksetzen auf einen bestimmten Status wäre sehr irreführend, insbesondere wenn Sie Konsumenten für Ihren Code haben.

    
Jason 29.05.2013 13:34
quelle
4

Ich bin dagegen und halte das für einen Missbrauch. Ich denke auch, dass RAII in C ++ eine schreckliche Idee ist. Mir ist bewusst, dass ich in beiden Positionen in der Minderheit bin.

Diese Frage ist ein Duplikat. Aus Gründen, warum ich denke, dass dies ein ungerechtfertigter Missbrauch der using-Anweisung ist, siehe: Ссылка

    
Eric Lippert 29.05.2013 15:12
quelle
2

Nein, die Verwendung von using und / oder Dispose ist nicht sinnvoll. Das Muster hat eine sehr klare Verwendung ( "Definiert eine Methode, um zugewiesene Ressourcen freizugeben." ), und das ist es nicht. Irgendwelche zukünftigen Entwickler, die diesen Code benutzen, würden ihn mit der Verachtung betrachten, die für solch ein Übel gerechtfertigt ist.

Wenn Sie diese Art des Verhaltens wollen, dann implementieren Sie Ereignisse und setzen Sie sie frei, kann der aufrufende Code sie abonnieren und den Cursor gegebenenfalls verwalten, andernfalls sollte der Cursor durch allgemeine Parameter und vielleicht handhabbar sein mit Begin und End Methoden (obwohl solche Namenskonventionen sind in der Regel für asynchrone Implementierungen von Methoden vorbehalten, erhalten Sie das Bild) - Hacking auf diese Weise kauft Sie eigentlich nichts.

    
Grant Thomas 29.05.2013 13:48
quelle
-1

Ich bin der Meinung, dass es sinnvoll ist, Einwegmaterial auf andere Weise zu verwenden als nur Objekte zu entsorgen. Natürlich kommt es auf den Kontext und die Verwendung an. Wenn es zu einem besser lesbaren Code kommt, dann ist es in Ordnung.

Ich habe es in einer Arbeitseinheit verwendet & amp; Repository-Muster-Implementierung wie:

%Vor%

Mit dieser Implementierung wird garantiert, dass geschachtelte Operationen ihre entsprechende UnitOfWork verwenden, ohne Parameter zu übergeben. Die Verwendung ist wie.

%Vor%

In diesem Beispiel verwenden repo1 und repo3 dasselbe UnitOfWork, während repo2 ein anderes Repository verwendet. Was der Leser liest, ist "neue Arbeitseinheit" und es ist sehr sinnvoll.

    
Mehmet Ataş 29.05.2013 13:48
quelle

Tags und Links