C # ¿Puedo anular un objeto de otra clase?
Pregunta
Tengo un objeto que se genera en una clase
public class CreatingClass
{
public T CreateObject<T>(Dictionary<string, object> parameters) where T : IMyInterface, new()
{
....
}
public void DestroyObject(IMyInterface objectToDestroy)
{
....
}
}
Llamo a esta función desde una clase de cliente, luego a veces necesito anularla a través de mi aplicación por parte de la clase creadora.
¿Puedo hacer algo como lo siguiente?
public class ClientClass
{
MyObject obj;
CreatingClass creatingClass = new CreatingClass();
private void AFunctionToCreateMyClass()
{
obj = creatingClass.CreateObject<MyClass>(parameters);
}
private void AFunctionToDeleteMyObject()
{
CreatingClass.DestroyObject(obj);
Assert.IsNull(obj);//Doesn't fail
}
}
Probé objectToDestroy = null, pero no pensé que funcionaría (y no lo hizo)
Solución
Tenga en cuenta que en realidad no puede destruir un objeto; Usted está sujeto a las reglas de recolección de basura. En un momento, puede buscar IDisposable
y llamar a Dispose (),
Puede usar los ejemplos de ref
proporcionados, pero no estoy seguro de que haya mucho sentido; es más sencillo simplemente borrar el campo con " obj = null; " ;.
El uso de ref
puede ser confuso, ya que funciona en la variable , es decir, si lo hace:
var tmp = obj;
DestroyObject(ref tmp);
entonces obj
seguirá siendo el valor original. A menos que tenga una buena razón, no recomiendo el enfoque ref
.
Otros consejos
Lo que quieres es
public void DestroyClass(ref IMyInterface objectToDestroy)
{
....
objectToDestroy = null;
}
Esto es establecerá su referencia local en nulo
Todos los parámetros en C # se pasan por valor, por lo que si desea modificar la referencia en sí, debe pasarla utilizando la palabra clave ref
.
¿Está buscando el patrón IDisposable ?
[Su 'CreatingClass' generalmente se denomina fábrica]
No está seguro de por qué le preocuparía anular un objeto; se recolectará como basura solo después de que se hayan eliminado todas las referencias 'raíz'. Pero si cambias a:
public void DestroyClass(ref IMyInterface objectToDestroy)
{
....
objectToDestroy = null;
}
y llamar como:
private void AFunctionToDeleteMyObject()
{
CreatingClass.DestroyObject(ref obj);
Assert.IsNull(obj);
}
Una pequeña aclaración sobre las respuestas proporcionadas ...
Los parámetros en C # se pasan por su tipo, valor para los tipos de valor, referencia para los tipos de referencia. Sin embargo, está pasando una interfaz que podría estar relacionada con una clase (tipo de referencia) o una estructura (tipo de valor), por lo tanto, debe declararlo explícitamente como una variable de referencia.
Sin embargo, lo que realmente deberías seguir (como se mencionó anteriormente) es el patrón IDisposable, que fue diseñado para esta funcionalidad.
EDITAR: Los parámetros se pasan por valor, pero para los tipos de referencia, la referencia es el valor. Por lo tanto, si destruye la referencia en la función, el tipo de referencia original no se ve afectado. Si realiza un cambio en la variable de referencia, es decir, modifica los datos en un conjunto de datos, el tipo de referencia original se actualiza fuera de la función.