Entsorgen der Mitglieder, die IDisposable implementieren

8

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.

    
Manish Basantani 11.06.2010, 12:25
quelle

5 Antworten

4

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:

%Vor%

Dann könnte Ihre Dispose -Methode etwas sauberer aussehen:

%Vor%

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.

    
Dan Tao 11.06.2010, 12:37
quelle
9

Ich mag @Dan Tao's Lösung, aber es ist viel besser als eine Erweiterungsmethode, imo:

%Vor%

Jetzt können Sie einfach member.SafeDispose() für jedes IDisposable in Ihrem Programm aufrufen, ohne sich Sorgen machen zu müssen. :)

    
tzaman 11.06.2010 19:50
quelle
0

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.)

    
LukeH 11.06.2010 12:35
quelle
0

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.

    
Hans Olsson 11.06.2010 12:37
quelle
-1

Versuchen Sie es.

%Vor%     
this. __curious_geek 11.06.2010 12:38
quelle
yii\base\ErrorException
Copied! Copy Stacktrace Search Stackoverflow Search Google Error

PHP Core Warningyii\base\ErrorException

PHP Startup: Unable to load dynamic library 'mongodb.so' (tried: /usr/lib64/php/modules/mongodb.so (/usr/lib64/php/modules/mongodb.so: cannot open shared object file: No such file or directory), /usr/lib64/php/modules/mongodb.so.so (/usr/lib64/php/modules/mongodb.so.so: cannot open shared object file: No such file or directory))

$_GET = [
    'id' => '360561',
    'url' => 'disposing-the-members-that-implement-idisposable',
];

$_SESSION = [
    '__flash' => [],
];