In meinen Dispose-Methoden (wie der unten stehenden) muss ich jedes Mal, wenn ich someObj.Dispose () aufrufen will, eine Überprüfung auf someObj! = null durchführen.
Ist das wegen schlechten Designs meinerseits? Ist es ein saubererer Weg, um sicherzustellen, dass Dispose von allen Mitgliedern (die IDisposable implementieren), die in einem Objekt verwendet werden, aufgerufen werden, ohne ein Risiko der NullReference-Ausnahme zu haben?
%Vor%Danke für Ihr Interesse.
Vielleicht kann jemand anderes hier reinhören, aber ich persönlich denke nicht, dass es ein Konstruktionsfehler ist - nur der sicherste Weg, es zu tun.
Nichtsdestotrotz hält Sie nichts davon ab, Ihren Aufruf null
check und Dispose
in eine bequeme Methode zu schreiben:
Dann könnte Ihre Dispose
-Methode etwas sauberer aussehen:
Als zusätzlichen Bonus löst dies auch eine mögliche Wettlaufsituation in Ihrem ursprünglichen Code. Wenn Sie in einem Multithread-Kontext ausgeführt wird, kann das if (_field != null) _field.Dispose()
-Muster zu einem NullReferenceException
führen, wenn _field
auf null
zwischen der Überprüfung und der Entsorgung gesetzt ist (selten, aber möglich). Die Übergabe von _field
als Argument an eine Methode wie DisposeMember
kopiert den Verweis auf eine lokale Variable in der Methode und eliminiert diese Möglichkeit, so unwahrscheinlich sie auch sein mag.
Nur Sie kennen die Antwort auf diese Frage!
Ohne die gesamte Klasse zu sehen, ist es für jeden anderen schwierig zu sagen, ob es möglich ist, dass diese Mitglieder jemals null sind, wenn Dispose
aufgerufen wird.
(Natürlich ist es in der Regel immer möglich, dass ein Referenztyp oder Nullable-Werttyp null ist. Daher ist es wahrscheinlich eine gute Methode, diese Null-Checks trotzdem immer einzuschließen.)
Die einzige andere Option, die ich mir vorstellen könnte, wäre, eine DisposeParameter
-Helfermethode zu erstellen, die ein Objekt als Parameter hat und nur prüft, ob es null ist und ansonsten Dispose. Auf diese Weise benötigen Sie nur eine Codezeile, um darüber zu verfügen, aber ich bin mir nicht sicher, ob es dadurch lesbarer wird.
Tags und Links c# idisposable nullreferenceexception