Pregunta

En un par de semanas, enseñaré a una clase de ingenieros de primer año los puntos de referencia más destacados en C # como parte de su curso de programación de primer año. La mayoría de ellos nunca han programado antes, y tuvieron suficientes problemas para aprender objetos, por lo que enseñar referencias será una batalla cuesta arriba. Planeo tener muchos ejemplos disponibles para que los estudiantes los analicen por su cuenta, pero solo mostrar un montón de ejemplos tiende a ser bastante abrumador si el concepto subyacente no 'hace clic'.

Así que haré la pregunta a la comunidad SO: ¿cuál es la mejor forma en que han visto las referencias enseñadas? ¿Qué lo hizo 'clic' para ti? ¿Hay algún material relacionado con referencias que me falta?

Mi plan de lección tentativo es:

  1. ¿Qué es una referencia (usando un argumento como el de Eric Lippert )
  2. Referencias y el recolector de basura
  3. Tipos de referencia y tipos de valor
  4. Tipos inmutables
  5. Pasar por referencia versus Pasar por valor (y todas las sutilezas de referencias a objetos que se pasan por valor)
  6. Un puñado de ejemplos desagradables que producen resultados inesperados si no comprende 1-5.
¿Fue útil?

Solución

Una forma en que lo escuché explicado es usar un teléfono celular o un walkie-talkie. Usted (el instructor) tiene un extremo y declara que es una instancia de objeto. Usted permanece en un lugar (es decir, el montón) mientras los estudiantes pasan el otro extremo (que está en el teléfono con altavoz si es un teléfono celular) alrededor del aula.

Pueden interactuar con usted a través de la " referencia " te tienen a ti, pero en realidad no te tienen '' tú '' en su posesión.

Otros consejos

Me gusta la analogía de URL que describe las diferencias entre los tipos de referencia y valor. Puede pasar una URL como referencia a algún contenido. Puede modificar esa URL sin modificar ese contenido. También puede acceder al contenido a través de la URL para modificar el contenido.

Esta es una referencia útil:

 http://www.yoda.arachsys.com/csharp/parameters.html

Intente explicar las referencias con cifras , ya que el texto puro a veces no llega a la mayoría de las personas. Muchos recursos y libros sobre el tema intentan explicarlo a través de cifras, ya que es difícil relacionar la asignación solo a través de la comunicación verbal (esto es principalmente un tema de atención para la mayoría de las personas).

Al menos trate de señalar cómo se relacionan los objetos entre sí, un ejemplo simple sería una referencia simple.

Dado:

class A {
    B b = new B();
}

class B {
   int mine = 1;
}

Al instanciar la clase A como objeto a de algún contexto, la siguiente figura ilustrará cómo se verá todo en el montón. El objetivo de la ilustración es mostrar cómo los diferentes objetos se relacionan entre sí y tener un modelo mental de cómo funciona el montón.

         +-A-----+
a: *---->|       |
         |       |   +-B--------+
         | b: *--+-->|          |
         |       |   | mine: 1  |
         +-------+   |          |
                     +----------+

También intente explicar la diferencia entre el montón y la asignación de la pila. Llamando a un método con parámetros. Un ejemplo simple sería algo como esto:

Dado el siguiente método:

public void doSomething(B b) {
   int doMine = b.mine + 1;
}

Al llamar a doSomething y dejar que haga sus cosas, al final la pila de doSomething se verá como a continuación. El punto que muestra que los objetos no residen directamente dentro de una pila, sino que solo se hace referencia a un objeto en el montón y los objetos se comparten a través de referencias.

whoever called doSomething *
                           |
                           v
+-doSomething-+   +-B--------+
| b: *--------+-->|          |
|-------------|   | mine: 1  |
| doMine: 2   |   +----------+
+-------------+

Otro ejemplo ilustrativo sería ilustrar una matriz que es un objeto, y una matriz multidimensional contiene una matriz de matrices.

Encontré este artículo realmente útil para Parámetro explicativo que pasa en C #. El artículo también hace un buen trabajo explicando el valor y los tipos de referencia en términos generales.

Es más una representación visual que me ayudó mucho.

Imágenes y diagramas.

Las personas forman imágenes mentales de los conceptos que están aprendiendo, y una representación visual de referencias y su relación con sus objetos asociados es una buena manera de comenzar. Del mismo modo, es muy útil visualizar objeto como que contiene las variables miembro (que incluye referencias a otros objetos) y los métodos miembro , como los diagramas UML.

Más adelante, puede profundizar en los detalles de cómo se implementan realmente las referencias y los tipos primitivos, si siente la necesidad de hacerlo. Pero demore estas discusiones el mayor tiempo posible, ya que las personas pueden atascarse al tratar de emparejar conceptos abstractos con los detalles de representación, lo que distrae el aprendizaje de los conceptos abstractos.

Cuando estaba aprendiendo VB6, las referencias realmente me confundieron un poco. Luego intenté aprender C ++, y después de tratar con punteros, las referencias tenían mucho sentido para mí. Entenderlo desde una perspectiva de lo que realmente está sucediendo fue más fácil para mí que entenderlo desde una perspectiva de conceptos. Tal vez puedas repasar las cosas ocultas en tu lección.

Sugeriría minimizar el uso del término simple "referencia" en conjunto, ya que se puede usar en .net para referirse a dos cosas muy diferentes: el contenido de las ubicaciones de almacenamiento de tipo de clase y los parámetros pasados ??con una " ref " índice. Utilice el término "objeto de referencia" para el primero, y "parámetro de referencia" para el último.

Al describir qué es una "referencia de objeto" es decir, sugeriría usar el término " ID de objeto " ;. Los ID de objeto tienen algunas cosas que los hacen diferentes de las "direcciones":

  1. No se pueden hacer muchas cosas con ID de objeto. Uno puede probar si uno está en blanco, verificar si dos de ellos son iguales, copiar uno en una ubicación de almacenamiento de tipo adecuado o buscar el objeto al que hace referencia uno y pedirle que haga algo. La mayoría de las solicitudes para hacer algo con un valor o variable de tipo clase son realmente solicitudes para hacer algo con el objeto al que se hace referencia. Tenga en cuenta que no se puede manipular una ID de un objeto de tal manera que se obtenga la ID de otro, como se puede hacer con las direcciones.
  2. Si bien el sistema debe tener un medio para convertir las ID de los objetos en direcciones, no hay garantía de que utilizará ningún medio en particular para hacerlo. Tampoco hay ninguna garantía de que el patrón de bits asociado con cualquier ID de objeto no cambie espontáneamente; todo lo que está garantizado es que si el patrón de bits cambia, el nuevo patrón se referirá al mismo objeto que el anterior.
  3. El sistema realiza un seguimiento de cada lugar donde se almacenan las ID de los objetos. Mientras exista cualquier copia de una ID de objeto, esa ID de objeto nunca se referirá a otra cosa que no sea la instancia del objeto para el que se creó. Por el contrario, en general, los sistemas que usan direcciones para cosas no rastrean todos los lugares donde se puede copiar una dirección. Es posible que un objeto deje de existir mientras alguien todavía tenga una copia de su dirección, y se cree un nuevo objeto con la misma dirección.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top