[SOLUCIONADO] C sharp Pregunta por Referencia de Objetos

Iniciado por crenpeva, Abril 02, 2020, 07:27:32 PM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Abril 02, 2020, 07:27:32 PM Ultima modificación: Abril 06, 2020, 02:16:46 PM por Bartz
Estoy iniciando en cSharp, pero tengo dudas con el ejercicio que les pegare mas abajo.  El ejercicio en si lo entiendo, lo debugeo con el visual studio y reviso como van cambiando las variables..o atributos de clase.
El atributo "raiz" es el que tiene tofos los notos, pero no entiendo porque, ya que en el código no veo donde le agregan nodos, si se le agregan al atributo "fondo".
Esto es lo que no entiendo, donde se le van agregando los nodos a "raiz".
Gracias.
------------------------------------------------------
Código: csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ListaTipoCola2
{
    class Cola
    {
        class Nodo
        {
            public int info;
            public Nodo sig;
        }

        private Nodo raiz, fondo;

        public Cola()
        {
            raiz = null;
            fondo = null;
        }

        public bool getVacia() {
            return (raiz == null);
        }

        public void Insertar(int info)
        {
            Nodo nuevo nuevo = new Nodo();
            nuevo.info = info;
            nuevo.sig = null;
            if ( getVacia() )
            {
                raiz = nuevo;
                fondo = nuevo;
            }
            else
            {
                fondo.sig = nuevo;
                fondo = nuevo;
            }
        }
    }
}

Abril 02, 2020, 09:05:07 PM #1 Ultima modificación: Abril 02, 2020, 09:11:33 PM por tr0n
Hola,
me tomo un tiempo en averiguarlo, pero si, los nodos se van agregando a raíz, porque cuando se ejecuta el bloque if, raíz y fondo están referenciando al mismo objeto, es decir, que en ese punto, cualquier cambio que hagas en fondo, lo vas a ver en raiz.

               _____
fondo -> | Nodo|
raiz    -> |_____|

Cuando se vuelve a llamar insertar, se crea un nuevo Nodo. Esto seria la referencia antes del bloque else.

nuevo -> | Nodo |

               _____
fondo -> | Nodo|
raiz    -> |_____|

Cuando se ejecuta la primera linea del bloque else, fondo.sig = nodo, el cambio se ve reflejado en raiz

               ________
fondo -> | Nodo      |    _____
raiz    -> |_____sig->  | Nodo |
                                   |          |
                     nuevo ->|_____|

Ahora, en la siguiente línea de código, a fondo se le cambia la referencia, ya no va a apuntar al mismo nodo que raíz, en cambio, va apuntar al mismo nodo que nuevo

               ________
              | Nodo      |    _____
raiz    -> |_____sig->  | Nodo |
                      fondo-> |          |
                     nuevo ->|_____|

Espero haber explicado bien. Lo importante es tener en cuenta que al asignar un objeto a una variable, esta variable NO recibe una copia del objeto con todos sus campos, en ves de eso, recibe una referencia para modificar este objeto.

Estimado,
al fin una respuesta clara y con conocimientos....ya la había planteado en otros foros, pero nadie fue capaz o se dio el tiempo de dar una explicación como la que me diste. Si entiendo algo de "POO", por lo que claramente se de lo que hablas, que al asignad una variable que es un objeto, no se le asigna un valor, sino que una referencia.
Necesitaba esta explicación ya que no sacaba nada con avanzar en mi curso sino lograba entender donde y porque se produce que "raiz" tiene todos los nodos.
Muchas gracias!