es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Se señala una instancia mediante otras variables?

Esto es poco probable, pero…

Entiendo que hay una forma de determinar si la variable A (var1, var2…, varX) apunta a una instancia de una clase usando Equals:

List<string> _mainInstance = new();
var var1 = _mainInstance;
var var2 = _mainInstance;
var var3 = _mainInstance;

// Entiendo cómo determinar si la variable apunta a _mainInstance
if (var1.Equals(_mainInstance))
{
    // Lo hace porque apunta por referencia
}

// Quiero comprobar si alguna variable todavía apunta a _mainInstance
if (!_mainInstance.AtiendenOtrasVariables())
{
    // Seguro eliminar _mainInstance
}

No sé en tiempo de diseño cuántos punteros habrá a _myInstance. Quiero verificar si mi _mainInstance tiene alguna variable que todavía apunte a él de vez en cuando. Pensé que tal vez con reflexión o recolección de basura, pero todas mis investigaciones al respecto no están dando resultados.

¿Existe alguna forma de examinar una variable (en este caso una instancia de una clase) y determinar si algo más (variables, propiedades de una instancia de clase) todavía apunta a ella?

Edición:
@GuruStron pregunta cuál es el problema subyacente que estoy intentando resolver.

Respuesta: Tengo un “árbol” de padres/hijos que necesito realizar un seguimiento. Eso en sí mismo es bastante fácil. Lo difícil es que el árbol tiene bloques que tienen una definición única y esa definición se reutiliza.

En el gráfico a continuación se muestra el árbol superior con estrellas. Las estrellas representan punteros a definiciones de bloques. Debajo de eso, a la izquierda, están las definiciones reales de los bloques.

Árbol de bloques

La definición del bloque se sustituye y el árbol final se ve así:

Árbol final

Cuando se elimina un puntero de bloque, necesito asegurarme de que nada más esté apuntando a esa definición del bloque y eliminar la definición del bloque cuando ya no sea necesario.

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Una posible solución es llevar un registro de todas las variables que apuntan a _mainInstance en una lista o HashSet separada. Cada vez que una variable se asigna para apuntar a _mainInstance, se agrega a la lista/HashSet, y cada vez que se reasigna o se sale de su ámbito, se elimina de la lista/HashSet.

    Luego, para verificar si alguna variable todavía apunta a _mainInstance, simplemente se verifica si la lista/HashSet está vacía. Este enfoque evita la necesidad de reflexión o recolección de basura.

    List<object> _pointersToMainInstance = new List<object>();
    List<string> _mainInstance = new List<string>();
    
    var var1 = _mainInstance;
    _pointersToMainInstance.Add(var1);
    
    var var2 = _mainInstance;
    _pointersToMainInstance.Add(var2);
    
    var var3 = _mainInstance;
    _pointersToMainInstance.Add(var3);
    
    //Para eliminar una variable de la lista cuando ya no apunta a _mainInstance
    var1 = null;
    _pointersToMainInstance.Remove(var1);
    
    //Para comprobar si alguna variable todavía apunta a _mainInstance
    if(_pointersToMainInstance.Count == 0)
    {
        //Es seguro eliminar _mainInstance
    }
    

    Esta solución asume que todas las variables que apuntan a _mainInstance son del mismo tipo (en este caso, List<string>). Si hay varios tipos de variables que pueden apuntar a _mainInstance, podrías utilizar un Dictionary<object, type=""> en lugar de un List<object> para llevar un registro de las variables y sus tipos.</object,>

Comments are closed.