return die variable verwendet, für die Verwendung im using C#
Bin ich wieder die variable erstelle ich in einer using-Anweisung in der using-Anweisung (klingt komisch):
public DataTable foo ()
{
using (DataTable properties = new DataTable())
{
//do something
return properties;
}
}
Wird diese über den Eigenschaften-variable??
Danach bin noch immer diese Warnung:
Warnung 34 CA2000 : Microsoft.Zuverlässigkeit : In der Methode " test.test', Ruf-System.IDisposable.Dispose für das Objekt 'Eigenschaften', bevor alle Verweise darauf außerhalb des Bereichs.
Irgendwelche Ideen?
Dank
- Egal, das ist einfach nur schlechtes design und sollte überarbeitet werden.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie zurückgeben möchten, können Sie nicht wickeln Sie es in ein
using
Aussage, denn wenn Sie lassen Sie die Klammern, es geht out of scope und wird entsorgt.Haben Sie instanziieren Sie es wie folgt:
- und call -
Dispose()
auf es später.foo()
==GetUsefulDataTable()
und dieusing
block sollte sein, was ruft diese Funktion auf.Ja, es wird über Sie - und geben es dann zurück. Dies ist fast immer eine schlechte Sache zu tun.
In der Tat für
DataTable
,Dispose
fast nie etwas (die Ausnahme sein, wenn es Remote irgendwo, IIRC), aber es ist immer noch eine grundsätzlich schlechte Idee. In der Regel sollten Sie hinsichtlich entsorgt Objekte als unbrauchbar.Angeblich, das ist das Muster für eine factory-Methode erzeugt ein Wegwerf-Objekt. Aber ich habe noch gesehen-Code-Analyse, beschweren sich über dies auch:
Damit soll gewährleistet werden, dass, wenn die Initialisierung fehlschlägt, wird das Objekt ordnungsgemäß entsorgt wird, aber wenn alles gelingt, eine undisposed Instanz der Methode zurückgegeben.
MSDN-Artikel: CA2000: Entsorgen Sie Gegenstände vor dem Verlust Rahmen.
Wrapper x = null; try { ... } catch { if (x != null) x.Dispose(); }
. Die Absicht ist nicht nur 100% mehr offensichtlich, aber vermeidet die unnötige variable temp und manuelle Bereinigung.catch
- Anweisung fehlt, ist ein rethrow, und sogar mit einer rethrow die Semantik nicht das gleiche wie nicht mit ein zu fangen. Unter anderem, wenn dietry
- block enthält, um Anrufe an eine Methodeblah
die konnten zu einer exception führen, fangen-und-rethrow wird verursachen, dass die stack-Ablaufverfolgung zum anzeigen der Zeilennummer der rethrow, anstatt den Aufrufblah
(der stack-trace innerhalbblah
richtig, aber die Nummer der Zeile für den Aufruf nicht).Ja. Warum verwenden Sie das
using
keyword auf etwas, das Sie nicht entsorgen möchten am Ende der code-block?Den Zweck der
using
Schlüsselwort ist, entsorgen Sie das Objekt.http://msdn.microsoft.com/en-us/library/yh598w02.aspx
Dem Punkt, der mit einem using-block ist eine künstliche Spielraum für ein Wert/Objekt. Wenn der using-block beendet ist, wird das Objekt gereinigt, weil es nicht mehr benötigt wird. Wenn Sie wirklich wollen, um das Objekt zurückzugeben, den Sie erstellen, als es ist nicht ein Fall, wo Sie verwenden möchten verwenden.
Diese gut funktionieren wird.
Ihren code mit dem Schlüsselwort erweitert:
Ihre variable wird entsorgt durch die Art, wie die Verwendung funktioniert. Wenn Sie wollen zurückkehren zu können-Eigenschaften, nicht wickeln Sie es in einem using-block.
Die anderen Antworten sind richtig: sobald Ihnen beenden des using-Blocks, wird das Objekt entsorgt. Der using-block ist ideal für die Herstellung sicher, dass ein Objekt wird entsorgt in einer fristgerechten Weise, so dass, wenn Sie nicht wollen, zu verlassen, auf der Verbraucher Ihre Funktion zu erinnern, zu entsorgen, das Objekt später, können Sie versuchen, so etwas wie dieses:
Diese Weise können Sie etwas sagen wie: