No es así. Esto es lo que hace automáticamente un recolector de basura: básicamente, cuando el tiempo de ejecución de .NET necesita memoria, se activa y elimina los objetos que ya no se usan.
Lo que tienes que hacer para que esto funcione es eliminar todos los linnks del objeto.
En su caso ....
obj1 = null;
al final, luego el objeto ya no se referencia y se puede reclamar desde el recolector de basura.
Puede consultar http://en.wikipedia.org/wiki/Garbage_collection_(computer_science) para obtener más información.
Tenga en cuenta que si el objeto tiene referencias a recursos no administrados (como archivos abiertos, etc.) debe implementar el patrón Desechable (interfaz IDisposable) y debe liberar explícitamente esas referencias cuando ya no necesite el objeto.
o simplemente use C++/CLI en su lugar, para que no tenga que recordar qué tipos implementan IDisposable y cuáles no, llamará automáticamente a Dispose cuando el objeto salga del alcance (si no está declarado como identificador) –
¡apenas una razón convincente para usar C++/CLI! :) –
@Ben Voigt Si implementa IDisposable correctamente, se llamará a la función Dispose cuando también quede fuera del alcance en C#. –