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)

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top