Verwendung der Anweisungsverwendung in C #

8

Ich habe einige Zweifel bezüglich der using-Anweisung:

Ich habe eine Klasse namens

MyJob, welches wegwerfbar ist. Dann habe ich auch eine Eigenschaft auf MyJob JobResults, die auch Einweg ist.

Mein Code:

%Vor%

Meine erste Frage lautet: In diesem Fall werden nach dem Verwendungsblock sowohl MyJob als auch MyJob.Results entfernt oder nur MyJob und NOT MyJob.Results?

Ich führe auch Parallelverarbeitung w.r.t Aufgaben in C # durch:

%Vor%

Meine zweite q, im obigen Code, was ist der richtige Weg, um sicherzustellen, Objekte korrekt zu entsorgen, wenn Ausnahmen in Aufgaben behandelt werden?

Tut mir leid, wenn meine Fragen zu naiv oder verwirrend sind, weil ich immer noch versuche, C # zu lernen und zu verstehen. Danke Leute!

    
theOne 25.04.2015, 11:49
quelle

4 Antworten

5
  

sind sowohl MyJob als auch MyJob.Results oder nur MyJob und NOT   MyJob.Results?

Das ist subjektiv für die Implementierung Ihrer Dispose -Methode. Da wir es in Ihrer Frage nicht gesehen haben, gehe ich davon aus, dass Sie Ihre Result -Eigenschaft derzeit nicht in MyJob.Dispose veräußern, daher wird es Letzteres sein.

Da nur MyJob in eine using -Anweisung eingebettet ist und wiederum davon ausgegangen wird, dass sie nichts mit Ihrer Result -Eigenschaft zu tun hat, wird sie im Gegensatz zu Results entsorgt, die nicht in eine% co_de eingeschlossen ist % -Anweisung.

Sie könnten entscheiden, dass using , da es Ihre MyJob -Eigenschaft einkapselt, auch dafür verantwortlich ist. Wenn Sie dies wünschen, können Sie Result in Results ablegen.

  

Was ist der richtige Weg, um sicherzustellen, dass Objekte korrekt entsorgt werden?   Umgang mit Ausnahmen in Aufgaben?

Wenn der Delegat, der an die MyJobs.Dispose übergeben wird, in eine Task Anweisung eingeschlossen wird, sind Sie sicher, da using Ihren Code in einen using Block umwandelt, falls eine Ausnahme in Ihrer% co_de auftritt % block, der try-finally -Block wird weiterhin using ausführen.

    
Yuval Itzchakov 25.04.2015, 11:58
quelle
2

Nur MyJobs ist entsorgt. Bei anderen Eigenschaften müssen Sie das Eigentumsrecht des Objekts verstehen: Wer das Objekt besitzt, sollte (im Allgemeinen) dafür verantwortlich sein, es zu beseitigen. Eine Eigenschaft, die IDisposable implementiert, könnte von anderen Instanzen verwendet werden, sodass Sie sie nur dann entfernen können, wenn Sie die IDisposable erstellt haben und keine anderen Verweise darauf vorhanden sind oder die Klasse ordnungsgemäß fehlschlägt, wenn sie weiß, dass sie entsorgt wurde / p>     

Ricardo Peres 25.04.2015 12:03
quelle
2

Hier gibt es viele gute Antworten, aber eine Sache bleibt. Wenn Sie sicher sein möchten, dass Ihr Objekt ordnungsgemäß entsorgt wird, da es nicht verwaltete Ressourcen verwendet, sollten Sie in Ihrem Objekt einen Destruktor implementieren, wie z. B.

%Vor%

Es wird jedoch empfohlen, dass Sie keinen Finalizer (Destruktor) verwenden, es sei denn, Sie schließen einen Typ mit nicht verwalteten Ressourcen ab, der keinen eigenen Finalizer enthält.

Siehe Ссылка für Best Practices zum Implementieren von IDisposable.

    
Ron Beyer 25.04.2015 12:13
quelle
0

1) Der beste Weg besteht darin, JobResults innerhalb der MyJob-Methode Dispose () zu platzieren. Sonst ist es nicht auf eigene Faust angeordnet.

2) Ich würde den finally -Teil implementieren, jedes Objekt durchgehen und entsorgen. In den meisten Fällen müssen Sie dies jedoch nicht tun. lies das

    
VladL 25.04.2015 11:59
quelle

Tags und Links