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
?
Antworten
Zu viele Anzeigen?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.
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
}
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
.
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í .
- See previous answers
- Weitere Antworten anzeigen