Hi!
object = null; entspricht object.Dispose(); vorausgesetzt es
existiert ein Dispose(). Leider finde ich die schriftliche
Nanana, das wage ich aber stark zu bezweifeln…
Quelle meiner „Behauptung“ momentan nicht. Intern ist es sogar
so, dass die Dispose Funktion in eine Finalize Funktion
„umgewandelt“ wird und vom GC ausgeführt wird.
Einfach mal ein Mini-Beispiel programmieren und sich die entstehende IL ansehen:
FileStream fs = new FileStream("C:\\Test.txt", FileMode.Open);
fs.Dispose();
fs = null;
liefert
// Code size 23 (0x17)
.maxstack 3
.locals init ([0] class [mscorlib]System.IO.FileStream fs)
IL\_0000: nop
IL\_0001: ldstr "C:\\Test.txt"
IL\_0006: ldc.i4.3
IL\_0007: newobj instance void [mscorlib]System.IO.FileStream::.ctor(string,
valuetype [mscorlib]System.IO.FileMode)
IL\_000c: stloc.0
IL\_000d: ldloc.0
IL\_000e: callvirt instance void [mscorlib]System.IO.Stream::smiley:ispose()
IL\_0013: nop
IL\_0014: ldnull
IL\_0015: stloc.0
IL\_0016: ret
Das Ganze ohne den Aufruf an Dispose() liefert:
// Code size 16 (0x10)
.maxstack 3
.locals init ([0] class [mscorlib]System.IO.FileStream fs)
IL\_0000: nop
IL\_0001: ldstr "C:\\Test.txt"
IL\_0006: ldc.i4.3
IL\_0007: newobj instance void [mscorlib]System.IO.FileStream::.ctor(string,
valuetype [mscorlib]System.IO.FileMode)
IL\_000c: stloc.0
IL\_000d: ldnull
IL\_000e: stloc.0
IL\_000f: ret
Die Aussage, dass das Zuweisen von null dem impliziten Aufruf von Dispose entspricht ist also, mit Verlaub, großer Quark!
Martin