Pergunta

Em um par de semanas, eu vou estar dando uma aula de engenheiros primeiro ano os principais pontos de referências em C # como parte de seu curso de programação de primeiro ano. A maioria deles nunca programou antes, e teve bastante dificuldade para aprender objetos, de modo a ensinar referências vai ser uma batalha difícil. Eu pretendo ter muitos exemplos disponíveis para os alunos a passar por conta própria, mas apenas mostrando um monte de exemplos tende a ser muito impressionante se o conceito subjacente não 'clique'.

Então eu vou colocar a questão para a comunidade SO: Qual é a melhor maneira que você viu referências ensinou? O que o tornou um 'clique' para você? Existe algum material de referência relacionada com a que eu estou perdendo?

O meu plano de aula provisório é:

  1. O que é uma referência (usando um argumento como de Eric Lippert)
  2. Referências e o coletor de lixo
  3. tipos de referência e tipos de valor
  4. tipos imutáveis ??
  5. Passagem por referência contra Passando por valor (e todas as sutilezas de referências de objeto que está sendo passado por valor)
  6. Um punhado de exemplos desagradáveis ??que produzem resultados inesperados se você não entender o 1-5.
Foi útil?

Solução

Uma maneira que eu ouvi-lo explicado é a utilização de um telefone celular ou walkie-talkie. Você (o instrutor) segurar uma extremidade e declarar que você é uma instância de objeto. Você ficar em um lugar (ie. Pilha), enquanto os estudantes passam a outra extremidade (que está em viva-voz, se é um telefone celular) em torno da sala de aula.

Eles podem interagir com você através da "referência" que eles têm para você, mas eles realmente não têm "você" na sua posse.

Outras dicas

Eu gosto da analogia URL que descreve as diferenças entre os tipos de referência e valor. Você pode passar em torno de uma URL como referência a alguns conteúdos. Você pode modificar a URL sem modificar esse conteúdo. Você também pode chegar ao conteúdo através da URL, talvez, modificar o conteúdo.

Esta é uma referência útil:

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

Tente explicar referências com figuras , como texto puro, por vezes, não passar para a maioria das pessoas. Muitos recursos e livros sobre o tema, que tentam explicar através de figuras como é difícil relacionar a alocação através da comunicação verbal sozinho (isto é principalmente uma questão de tempo de atenção para a maioria das pessoas).

Pelo menos tentar apontar como os objetos se relacionam entre si, um exemplo simples seria uma simples referência.

Dada:

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

class B {
   int mine = 1;
}

Ao instanciar classe A como objeto a de algum contexto, a figura a seguir ilustra como tudo vai olhar na pilha. O ponto da ilustração é mostrar como os diferentes objetos se relacionam entre si e ter um modelo mental de como funciona a pilha.

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

Além disso, tente explicar a diferença entre pilha e alocação de pilha. Chamar um método com parâmetros. Um exemplo simples seria algo como isto:

Dado o seguinte método:

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

Ao chamar doSomething e deixá-lo fazê-lo de coisas, a pilha do doSomething final será parecido com abaixo. O ponto mostrando que os objetos não residem diretamente dentro de uma pilha, mas é apenas a que se refere a um objeto na pilha e objetos são compartilhados através de referências.

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

Outro exemplo ilustrativo seria que ilustra uma matriz que representa um objecto, e uma matriz multidimensional contém uma matriz de matrizes.

este artigo realmente útil para explicando parâmetro passando em C #. O artigo também faz um bom trabalho explicando os tipos de valor e de referência em termos gerais.

É mais de uma representação visual que me ajudou muito.

Fotos e diagramas.

As pessoas formam imagens mentais dos conceitos que estão aprendendo, e uma representação visual do referências e sua relação com o seu associado objetos é uma boa maneira de começar. Da mesma forma, visualizando objecto como contendo membro variáveis ?? (que inclui referências a outros objectos) e membro métodos , um diagramas UML la, é muito útil.

Mais tarde, você pode se aprofundar nos detalhes de como referências e tipos primitivos são realmente implementadas, se você sentir a necessidade de fazê-lo. Mas atrasar essas discussões tanto tempo quanto possível, como as pessoas podem se atolar em tentar emparelhar conceitos abstratos para os detalhes de representação, que distrai de aprender os conceitos abstratos.

Quando eu estava aprendendo VB6, referências realmente me confundiu um pouco. Então eu tentei aprender C ++, e depois de lidar com ponteiros, referências fazia sentido para mim. Compreendê-la a partir de uma perspectiva que-é-realmente-acontecendo era mais fácil para mim do que compreendê-la a partir de uma perspectiva oo-conceitos. Talvez você possa passar por cima das coisas sob o capô em sua aula.

Gostaria de sugerir a minimização de um uso do termo nua "de referência" por completo, uma vez que pode ser usado em .net para se referir a duas coisas muito diferentes: o conteúdo de locais de armazenamento do tipo classe, e os parâmetros passados ??com um "ref " qualificador. Usar o termo "objeto de referência" para o primeiro, e "ref parâmetro" para o último.

Ao descrever o que uma "referência de objeto" é, eu sugiro usar o termo "identificação do objeto". de identificação do objeto tem algumas coisas que os tornam diferentes dos "endereços":

  1. Não se pode fazer muitas coisas com identificação do objeto do. Pode-se testar se um estiver em branco, verifique se dois deles são iguais, copiar um para um local de armazenamento de tipo adequado, ou procurar o objeto referido por um e pedir para ele fazer alguma coisa. A maioria dos pedidos de fazer algo com um valor-tipo de classe ou variáveis ??são realmente pede para fazer alguma coisa com o que se refere a-objeto. Note-se que não se pode manipular um ID de um objeto em uma forma de obter o ID de outro, como se pode ver com endereços.
  2. Enquanto o sistema deve ter um meio de converter objeto ID da endereços, não há nenhuma garantia de que vai usar todos os meios particulares de fazê-lo. Também não há qualquer garantia de que o padrão de bits associados a qualquer identificação do objeto não vai mudar espontaneamente; tudo o que é garantido é que, se as mudanças bit padrão, o novo padrão vai se referem ao mesmo objeto como o velho.
  3. O sistema mantém o controle de cada lugar desse objeto ID são armazenados. Enquanto qualquer cópia de um Object ID existe, que ID do objeto nunca se referir a qualquer coisa que não seja a instância do objeto para o qual foi criado. Em contrapartida, em geral, os sistemas que usam endereços para que as coisas não acompanhar cada lugar onde um endereço pode ser copiado. É possível que um objeto pode deixar de existir enquanto alguém ainda tem uma cópia de seu endereço, e alguns novo objeto pode ser criado com o mesmo endereço.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top