2010-11-19 9 views
4

Ich erstelle ein Objekt (obj unten) in der Verwendung und Rückgabe dieses Objekts als Teil der Funktion return.Will dies Ursache jedes Problem wie Objekt wird verworfen, bevor ich versuche, zurückgegebenen Wert in einem anderen funktionieren?Zurückgeben eines Objekts erstellt von USING

using (MyObject obj = new MyObject()) 
{ 
    . 
    . 
    . 
    return obj; 
} 
+0

http://msdn.microsoft.com/en-us/library/ms182289.aspx Ich versuche CA2000 Warnung für Codes wie dies zu beheben. – aziz

Antwort

16

Wird dies dazu führen, dass ein Problem wie das Objekt entfernt wird, bevor ich versuche, den zurückgegebenen Wert in einer anderen Funktion zu verwenden?

Ja.

Können Sie erklären, was Sie hier versuchen? Dieser Code ergibt keinen Sinn. Die ganze Punkt von "Verwendung" ist, dass Sie mit das Objekt hier nur sind und dann automatisch loswerden seiner knappen nicht verwalteten Ressourcen, wodurch es unbrauchbar. Es gibt wahrscheinlich einen besseren Weg, um das zu tun, was Sie tun möchten.

+1

+1 während andere Antworten richtig sind, denke ich, es ist wichtig, dem Benutzer genau zu erklären, was * using * gemeint war zu tun und Eric bietet das. –

+0

+1 für das Stellen der richtigen Frage –

+0

Ich habe einen Kommentar zu der Frage hinzugefügt, was ich zu erreichen versuche. Danke – aziz

5

wird das Objekt Dispose() -d sein, wenn es außerhalb des Gültigkeitsbereichs geht, sei es durch return oder einem anderen Codepfad. Der einzige Zweck von using besteht darin, einen ausfallsicheren Mechanismus für IDisposable Objekte des lokalen Gültigkeitsbereichs zur Verfügung zu stellen, um alles zu bereinigen, was auch immer im beiliegenden Codeblock geschieht.

Das wird zu Problemen in Ihrer Anruffunktion führen, tun Sie dies nicht.

2

Ihr Objekt wird sofort nach der Rückgabe entsorgt. Es ist immer noch technisch brauchbar, da es nicht Müll gesammelt wurde, aber es wird die Dispose-Funktion ausgeführt.

Die Regel, der ich in diesem Fall folge, ist, dass die Methode, die das Objekt empfängt, mit der Entsorgung beauftragt wird. Sie wissen nicht, wann diese Methode fertig sein wird, also ist es die Aufgabe dieser Methode, sich selbst zu ordnen, wenn sie fertig ist.

+0

Sollte es nicht heißen "wie es * nicht * Müll gesammelt wurde"? –

+0

yep danke, vertippte das. – kemiller2002

1

nur meine persönliche Meinung und vielleicht nicht die richtigen, aber die Verwendung von Konstrukt sollte verwendet werden, wenn eine Arbeitseinheit in einem Bereich definiert ist, und Sie würden das Objekt in den angeordneten mit wie konstruieren werden.

+0

sollte keine Meinung sein, es ist eine Tatsache, das ist was * using * ist für. +1 –

0

Ja, das wird Probleme verursachen. Wenn Sie diesen Fall haben (ich könnte mir eine Methode vorstellen, die eine Datenbankzugriffsklasse zurückgibt), verwenden Sie keinen using Block, da Sie für die Beseitigung dieses Objekts nicht erreichbar sind, aber der Aufrufer ist.

0

Es würde wahrscheinlich für ein Objekt ohne eine Dispose-Methode funktionieren, aber dann wäre es nicht nötig, 'using' zu verwenden.

Auch wenn es für Ihr bestimmtes Objekt funktioniert, ist es falsch. Das ist nicht das, was das Konstrukt "using" für

0

ist. Technisch gesehen ist es davon abhängig, was MyObject in der Dispose Methode der implementierten IDisposable Schnittstelle tut.

Theoretisch könnte das vollkommen in Ordnung sein, da Sie die Dinge einfach in ein unnötiges try/catch/finally block verpacken.

public void DoStuff() 
{ 
    MyObject myObject = GetMyObject(); 
    Console.WriteLine("Name: " + myObject.Name); 
} 

private MyObject GetMyObject() 
{ 
    using (MyObject obj = new MyObject()) 
    { 
     obj.Name = "Aaron"; 
     return obj; 
    } 
} 

public class MyObject : IDisposable 
{ 
    public String Name { get; set; } 

    #region IDisposable Members 

    public void Dispose() 
    { 
     //depends what you do in here... 
    } 

    #endregion 
} 

Name: Aaron

0

Sie würden eine Ausnahme in den Verbrauchern des Objekt erhalten Objekt sagen, im Wesentlichen angeordnet ist, wie das ist, was die Verwendung von Rahmen Dosis - die IDisposable-Implementierung aufruft.

0

Wenn Sie ein Einweg-Objekt zurückgeben müssen, müssen Sie sicherstellen, dass alle Codepfade entweder das Objekt zurückzugeben oder entsorgen. Beachten Sie, dass eine Ausnahme, die aus der Funktion IS geworfen wird, ein gültiger Codepfad ist. Um diesen Fall abzudecken, möchten Sie wahrscheinlich das Code-Segment zwischen der Erstellung und der Rückgabe in try-catch oder try-finally einschließen, um sicherzustellen, dass das Objekt ordnungsgemäß entsorgt wird, wenn die return-Anweisung nicht erfolgreich erreicht wird.