Ni le compilateur ni le moteur d'exécution ne sont requis pour garantir que les locals hors champ ont effectivement la durée de vie de leur contenu tronquée. Il est parfaitement légal pour le compilateur ou le runtime de traiter cela comme si les accolades n'étaient pas là, dans le but de calculer la durée de vie. Si vous avez besoin d'un nettoyage par accolade, implémentez IDisposable et utilisez le bloc "using".
MISE À JOUR:
En ce qui concerne votre question "pourquoi est-ce différent optimisé vs builds unoptimized", eh bien, regardez la différence de codegen.
non optimisé:
.method private hidebysig static void Main() cil managed
{
.entrypoint
// Code size 28 (0x1c)
.maxstack 1
.locals init (class test.Foo V_0)
IL_0000: nop
IL_0001: nop
IL_0002: newobj instance void test.Foo::.ctor()
IL_0007: stloc.0
IL_0008: nop
IL_0009: call void [mscorlib]System.GC::Collect()
IL_000e: nop
IL_000f: call void [mscorlib]System.GC::WaitForPendingFinalizers()
IL_0014: nop
IL_0015: call string [mscorlib]System.Console::ReadLine()
IL_001a: pop
IL_001b: ret
} // end of method Program::Main
OPTIMISE:
.method private hidebysig static void Main() cil managed
{
.entrypoint
// Code size 23 (0x17)
.maxstack 8
IL_0000: newobj instance void test.Foo::.ctor()
IL_0005: pop
IL_0006: call void [mscorlib]System.GC::Collect()
IL_000b: call void [mscorlib]System.GC::WaitForPendingFinalizers()
IL_0010: call string [mscorlib]System.Console::ReadLine()
IL_0015: pop
IL_0016: ret
} // end of method Program::Main
De toute évidence, une énorme différence. Clairement dans la construction non optimisée, la référence est stockée dans l'emplacement local zéro et n'est jamais supprimée jusqu'à la fin de la méthode. Par conséquent, le CPG ne peut pas récupérer la mémoire avant la fin de la méthode. Dans la construction optimisée, la référence est stockée sur la pile, immédiatement retirée de la pile, et le GC est libre de la récupérer puisqu'il n'y a plus de référence valide sur la pile.
Ok. ça explique beaucoup. Merci. –
Excellente mise à jour de votre message, Eric. Merci beaucoup! –