C sharp - C sharp Pregunta por Referencia de Objetos

 
Vista:
sin imagen de perfil
Val: 17
Ha aumentado su posición en 69 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

C sharp Pregunta por Referencia de Objetos

Publicado por Cristian (6 intervenciones) el 24/03/2020 21:56:04
Hola a todos. Me estoy iniciando en este lenguaje, tengo algunas nociones de java por lo que algo entiendo la poo.
Vi que por ejemplo c sharp tiene clases parciales .
En el ejercicio adjunto no puedo entender como el atributo "raiz" va guardando todos los nodos veo que solo solo se inicializa una vez, y eso es lo necesito que alguien me lo explique, como es que se van agregando los nodos sin "tocar" este atributo . El resto del ejercicio lo entiendo.
Gracias.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 318
Bronce
Ha aumentado 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

C sharp Pregunta por Referencia de Objetos

Publicado por Agustin (102 intervenciones) el 24/03/2020 22:24:50
A ver, por donde empiezo:

1 - Te felicito por haber empezado a usar C#. Si conoces java, te vas a dar cuenta rápidamente que C# es un lenguaje muchísimo más moderno, productivo, flexible, versátil, y en definitiva muchísimo más placentero para trabajar que java, que es un lenguaje horrendo y arcaico.

2 - Iniciar los campos a su valor por defecto es completamente innecesario. El default de todo reference type es null, con lo cual las lineas 20 y 21 de tu código son redundantes. Hay que sacarlas.

3 - Luego de sacar las lineas 20 y 21, el constructor Cola() te va a quedar vacio. Un constructor publico vacío es redundante, hay que sacarlo tambien.

4 - el codigo

1
2
3
4
if ([condicion])
   return true;
else
   return false;

es redundante, irrespectivamente de cual sea la [condicion], porque [condicion] ya es una expresion que devuelve true o false en si misma, con lo cual el metodo Vacia() se deberia escribir asi:

1
2
3
4
public bool Vacia()
{
   return raiz == null;
}

y ya que estamos (y aca es donde vas viendo las ventajas de C#), podes usar un Expression-bodied member para reducir el ruido y que tu código sea más breve y conciso:

1
public bool Vacia() => raiz == null;

asi de simple, sin llaves, sin return, sin ruido inutil.

4 - Acostumbrémonos a usar nombres de variables claros. Nadie nos va a cobrar plata por tipear 5 letras mas, y "siguiente" es mucho mas claro que "sig".

5 - declarar una variable e inmediatamente asignarla en la linea siguiente es redundante. Las lineas 34 y 35 de tu código habría que reemplazarlas por:

1
var nuevo = new Nodo();

y ya que estamos (otra vez ventajas sobre java acá), podés usar la sintáxis de inicialización de objetos para que tu código sea más claro:

1
var nuevo = new Nodo { info = info };

y como dije antes, inicializar una referencia a null no tiene ningun sentido.

6 - y para contestar tu pregunta, no veo que el valor de raiz se esté modificando, fuera del caso de insertar el primer valor en el momento en que raiz es null.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 318
Bronce
Ha aumentado 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

C sharp Pregunta por Referencia de Objetos

Publicado por Agustin (102 intervenciones) el 24/03/2020 22:40:27
Otra cosa: las clases parciales son útiles para cuando tenés una parte autogenerada de tu clase (por alguna herramienta, por ejemplo el diseñador de Winforms o un template de T4), y una parte que escribís vos.

No abuses de las clases parciales para hacer clases gigantes repartidas en muchos archivos. Lo más probable es que estés violando el principio de separation of concerns o el SRP.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 17
Ha aumentado su posición en 69 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

C sharp Pregunta por Referencia de Objetos

Publicado por Cristian (6 intervenciones) el 24/03/2020 23:56:48
Hola, muchas de tus recomendaciones de codigo ya las hice, porque meparecieron de sentido comun sobre todo el metodo que devuelve si el la lista esta vacia. Lo que pasa es que copie ese ejercicio directo de la pagina en donde lo saque.
El atributo "raiz" va guardando los nodos, por ejemplo, si inserto el valor 5, 10, 15, raiz tendra tres nodos con los valores señalados, pero no entendi como es que se actualiza, ya que el codigo solo lo inicializa una vez. Esto lo revise en el visual studio en modo debbug.
Tambien me parecio un lenguaje mucho mas limpio y liviano que java, pero el visual studio consume muucha maquina. minimo 8 gb en ram.
Muchas gracias por responder. Muy buena respuesta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 318
Bronce
Ha aumentado 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

C sharp Pregunta por Referencia de Objetos

Publicado por Agustin (102 intervenciones) el 25/03/2020 00:02:02
en realidad raiz es un solo nodo, y cada nodo tiene un campo "sig" (siguiente). Si tenes el debugger mostra una captura de pantalla y si queres te explico lo que significa, pero si es un grafo de objetos.

En ningun caso el campo raiz puede tener otra cosa que no sea null o un (y solo un) nodo. Esto es asi invariablemente por el type system. Nunca un campo de tipo X puede tener una lista de X, porque en ese caso el tipo del campo deberia ser List<X> o algun otro enumerable.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 17
Ha aumentado su posición en 69 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

C sharp Pregunta por Referencia de Objetos

Publicado por Cristian (6 intervenciones) el 25/03/2020 01:26:56
ejercicio
Estimado, acabo de subir una foto con el debug del ejercicio enviado anteriormente. En la imagen se aprecia que el atributo raiz tiene los nodos insertados, pero que no se porque los tiene .
Gracias nuevamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 318
Bronce
Ha aumentado 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

C sharp Pregunta por Referencia de Objetos

Publicado por Agustin (102 intervenciones) el 25/03/2020 01:28:35
Como te dije, raiz solo es UN nodo, que adentro tiene info = 5, y siguiente = OTRO nodo, que adentro tiene info = 10, y siguiente OTRO nodo, que adentro tiene info = 5, y siguiente = null.

Ves? es como un arbol, un grafo de objetos, pero en ningun momento puede raiz tener otra cosa que no sea null o UN nodo, como dije antes.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 17
Ha aumentado su posición en 69 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

C sharp Pregunta por Referencia de Objetos

Publicado por Cristian (6 intervenciones) el 25/03/2020 12:27:57
Hola,
si se que es un nodo, con dos propiedades, info y siguiente, y este siguiente es quien va teniendo los nodos. Eso lo entiendo, pero no se porque los va agrregando, no se en que parte del còdigo se agregan o como se agregan. Esto puntualmente es lo que no entiendo, como se van agregando los nodos a "raiz"
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 318
Bronce
Ha aumentado 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

C sharp Pregunta por Referencia de Objetos

Publicado por Agustin (102 intervenciones) el 25/03/2020 16:36:08
La cola tiene una propiedad "fondo" que apunta al ultimo Nodo que agregaste.

Fijate que en la linea 35 cuando agregas un Nodo nuevo, le asigna ese nuevo nodo en la propiedad "siguiente" del "fondo". Asi se van agregando uno detras del otro, justamente como una cola.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 17
Ha aumentado su posición en 69 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

C sharp Pregunta por Referencia de Objetos

Publicado por Cristian (6 intervenciones) el 25/03/2020 19:04:50
Estimado, gracias por la paciencia, creo que tengo algún tipo de ceguera . No lo veo, tu mencionas el atributo "fondo", pero yo pregunto por "RAIZ", en la imagen adjunta 222.png, se puede ver como los dos atributos de la cola : fondo y raiz tienen nodos, pero solo el "raiz" los tiene todos, y no se ve donde los agrega, esta es mi cuestión, y quiero entenderlo. también me doy cuenta que "nuevo" sera siempre un nuevo nodo y su referencia se pierde al salir del nodo.
Otra duda,
2- fondo.siguiente = nuevo ---> acá se ve como se le asigna una nueva referencia apuntando al nuevo nodo.
3- fondo = nuevo ---> acá entendí que fondo ahora apuntara a la dirección de memoria de nuevo....que pasa entonces con la linea anterior, donde se le asigna nuevo a siguiente?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 318
Bronce
Ha aumentado 1 puesto en C sharp (en relación al último mes)
Gráfica de C sharp

C sharp Pregunta por Referencia de Objetos

Publicado por Agustin (102 intervenciones) el 25/03/2020 20:22:10
pero solo el "raiz" los tiene todos

No, Raiz solamente tiene una referencia al nodo siguiente, y a su propio valor, como lo indica la definición de la clase Nodo.
Ninguna instancia de ninguna clase puede contener datos que no estén declarados en la clase.

Y si abris en el debugger la flechita para ver lo que contiene "fondo" te vas a dar cuenta que es lo mismo.

1
2
fondo.siguiente = nuevo;
fondo = nuevo;

esto hace que el nodo que actualmente es el ultimo deje de ser el ultimo, y el nuevo ahora pasa a ser el ultimo. El fondo anterior sigue estando en la cola porque es referenciado por su "padre" en la propiedad siguiente.

Creo que te ayudaría mucho a entender ponerle una propiedad "Nombre" al Nodo, y que el primero se llame "Raiz" y que los siguientes se vayan llamando "Nodo1", "Nodo2", y asi, para que veas mejor las instancias de los objetos en el debugger.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 17
Ha aumentado su posición en 69 puestos en C sharp (en relación al último mes)
Gráfica de C sharp

C sharp Pregunta por Referencia de Objetos

Publicado por Cristian (6 intervenciones) el 26/03/2020 01:54:00
Gracias, seguiré tus recomendaciones.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar