creo que por el diseño de los ejecutores de GC, no se puede velocidad GC con anulación. Estoy seguro de que preferirían que no te preocupes por cómo/cuando se ejecuta GC - trátalo como este omnipresente Siendo protegiéndolo y mirándolo por todas partes ... (inclina la cabeza hacia abajo, levanta el puño hacia el cielo) ...
Personalmente, a menudo establezco explícitamente las variables como nulas cuando termino con ellas como una forma de auto-documentación. No declaro, uso, y luego configuro nulo más tarde; anulo inmediatamente después de que ya no se necesitan. Estoy diciendo, explícitamente, "Ya terminé oficialmente contigo ... se habrá ido ..."
¿Es necesario anular en un lenguaje GC? No. ¿Es útil para el GC? Tal vez sí, tal vez no, no estoy seguro, por diseño realmente no puedo controlarlo, y sin importar la respuesta de hoy con esta versión o esa, las futuras implementaciones de GC podrían cambiar la respuesta más allá de mi control. Además, si/nulling se optimiza, es un poco más que un comentario de lujo si se quiere.
Me imagino que si mi intención es más clara para el siguiente tonto pobre que sigue mis pasos, y si "podría" potencialmente ayudar a GC a veces, entonces vale la pena para mí. En general, me hace sentir limpio y ordenado, y a Mongo le gusta sentirse ordenado y claro. :)
Lo veo así: los lenguajes de programación existen para permitir que las personas den a otras personas una idea de intento y un compilador una solicitud de trabajo de qué hacer; el compilador convierte esa solicitud a un idioma diferente (a veces varios) para una CPU: la (s) CPU (s) podría (n) indicar el lenguaje que usó, la configuración de pestañas, comentarios, énfasis estilístico, nombres de variables, etc. - una CPU tiene que ver con el flujo de bits que le dice qué registros y códigos de operación y ubicaciones de memoria para twiddle. Muchas cosas escritas en el código no se convierten en lo que consume la CPU en la secuencia que especificamos. Nuestro C, C++, C#, Lisp, Babel, ensamblador o lo que sea es teoría en lugar de realidad, escrito como una declaración de trabajo. Lo que ves no es lo que obtienes, sí, incluso en lenguaje ensamblador.
Entiendo la mentalidad de "cosas innecesarias" (como líneas en blanco) "no son más que ruido y desordenar el código". Ese fui yo al principio de mi carrera; Lo entiendo totalmente. En esta coyuntura me inclino hacia lo que hace que el código sea más claro. No es como si estuviera agregando incluso 50 líneas de "ruido" a mis programas, son algunas líneas aquí o allá.
Existen excepciones a cualquier regla. En escenarios con memoria volátil, memoria estática, condiciones de carrera, singletons, uso de datos "obsoletos" y todo ese tipo de podredumbre, eso es diferente: NECESITA administrar su propia memoria, bloqueando y anulando como apropos porque la memoria no es parte de el Universo GC'd - ojalá todos entiendan eso. El resto del tiempo con los lenguajes de GC es una cuestión de estilo en lugar de necesidad o un aumento de rendimiento garantizado.
Al final del día, asegúrese de entender qué es elegible para GC y qué no; bloquear, desechar y anular apropiadamente; encerar, encerar; inhala exhala; y para todo lo demás, digo: si se siente bien, hazlo. Su kilometraje puede variar ... como debería ...
+1 gran pregunta. ¿Alguien sabe una circunstancia bajo la cual el compilador optimizará la tarea por completo? es decir, si alguien miró a MSIL bajo circunstancias diferentes y anotó IL para establecer un objeto como nulo (o la falta del mismo). –