pasar - parametros por referencia c#
C#: ¿deberían las variables de objeto ser asignadas a null? (7)
¿Debes apagar tu auto antes de empujarlo al lago?
No. Es un error común, pero no hace ninguna diferencia. No está configurando el objeto en nulo, solo una referencia a él: el objeto todavía está en la memoria y aún debe ser recolectado por el recolector de basura.
En C #, ¿es necesario asignar una variable de objeto a null
si ha terminado de usarla, incluso cuando saldrá del ámbito de todos modos?
Asignar a nulo es generalmente una mala idea:
- Conceptualmente, es simplemente inútil.
- Con muchas variables, podría tener suficientes asignaciones adicionales para anular que aumente apreciablemente el tamaño del método. Cuanto más largo es el código fuente de algo, más esfuerzo mental se toma para leerlo (incluso si gran parte de él es solo algo que se puede filtrar) y más fácil es detectar un error. Hacer el código más detallado de lo necesario solo cuando hacerlo lo hace más comprensible.
- Es posible que su asignación nula no se optimice. En ese caso, es posible que el código compilado no realice la verdadera desasignación hasta que realmente alcance esa asignación nula, mientras que en la mayoría de los casos, una vez que la variable no va a hacer nada más que no esté fuera del alcance (ya veces incluso antes) puede ser desasignado Por lo tanto, puede tener un impacto de rendimiento muy pequeño.
La única vez que asigno algo a nulo para "borrar" una variable que ya no se usará, en lugar de que nulo sea en realidad un valor que explícitamente quiero asignar, es en uno de los dos casos posibles:
- Es un miembro de un objeto posiblemente de larga duración, ya no será utilizado por ese objeto y tiene un tamaño considerable. Aquí la asignación a nulo es una optimización.
- Es un miembro de un objeto posiblemente de larga duración, ya no será utilizado por ese objeto y, por lo tanto, ha estado dispuesto a liberar sus recursos. En este caso, la asignación a nulo es una cuestión de seguridad, ya que puede ser más fácil encontrar un caso en el que uno usa accidentalmente un objeto nulo que cuando usa accidentalmente un objeto dispuesto.
Ninguno de estos casos se aplica a las variables locales, solo a los miembros, y ambos son raros.
La mayoría de estas respuestas tienen la respuesta correcta, pero por las razones incorrectas.
Si es una variable local, la variable se caerá de la pila al final del método y, por lo tanto, el objeto al que estaba apuntando tendrá una referencia menos. Si esa variable era la única referencia al objeto, entonces el objeto está disponible para GC.
Si establece la variable en nulo (y muchos de los que lo hicieron aprendieron a hacerlo al final del método), entonces podrían terminar extendiendo el tiempo que el objeto permanece en la memoria porque el CLR creerá que el objeto no puede ser recopilado hasta el final del método porque ve una referencia de código al objeto que se encuentra allí. Sin embargo, si omite la configuración de nulo, el CLR puede determinar que no aparecen más llamadas para el objeto después de cierto punto en su código y, aunque el método aún no se ha completado, el GC puede recopilar el objeto.
Lo que importa más IMO es llamar a Dispose en los objetos que implementan IDisposable.
Aparte de eso, asignar nulo a las variables de referencia solo significa que usted está indicando explícitamente el final del alcance (la mayoría de las veces, solo algunas instrucciones anticipadas (por ejemplo, las variables locales en el cuerpo del método)) Es muy posible que el tiempo de ejecución haga lo mismo, por lo que realmente no se obtiene nada de eso. En algunos casos, como las variables estáticas, etc. (cuyo alcance es el nivel de la aplicación), debe asignar una variable a nulo si ha terminado de usarlo para que el objeto se recoja la basura.
No, y de hecho eso podría ser peligroso y propenso a errores (considere la posibilidad de que alguien intente usarlo más adelante, sin darse cuenta de que estaba configurado como nulo). Solo establece algo en nulo si hay una razón lógica para establecerlo en nulo.
No. Cuando se trata de variables locales, no hay ninguna diferencia si tiene una referencia al objeto o no, lo que importa es si la referencia se usará o no.
Poner una asignación nula adicional en el código no afecta mucho al rendimiento, y no afecta en absoluto a la administración de la memoria, pero agregará sentencias desmotivadas al código que lo hace menos legible.
El recolector de basura sabe cuándo se usó la referencia por última vez en el código, por lo que puede recolectar el objeto tan pronto como ya no sea necesario.
Ejemplo:
{
// Create an object
StringBuilder b = new StringBuilder();
b.Append("asdf");
// Here is the last use of the object:
string x = b.ToString();
// From this point the object can be collected whenever the GC feels like it
// If you assign a null reference to the variable here is irrelevant
b = null;
}
Solo me gustaría agregar que AFAIK fue solo un patrón válido para el lanzamiento de Visual Basic en un punto, e incluso eso fue algo discutible. (IIRC era solo para objetos DAO.)