Вопрос

Через пару недель я буду преподавать классу инженеров-первокурсников основные моменты C# в рамках их первого курса программирования.Большинство из них никогда раньше не программировали и имели достаточно проблем с изучением объектов, поэтому обучение справочным материалам будет непростой задачей.Я планирую предоставить учащимся множество примеров, которые они смогут разобрать самостоятельно, но просто показать кучу примеров может быть довольно сложно, если основная концепция не «захватывает».

Итак, я задам вопрос сообществу SO:какой лучший способ преподавания вы видели в справочных материалах?Что заставило вас «щелкнуть»?Есть ли какой-либо справочный материал, который мне не хватает?

Мой примерный план урока:

  1. Что такое ссылка (с использованием аргумент, подобный аргументу Эрика Липперта)
  2. Ссылки и сборщик мусора
  3. Ссылочные типы и типы значений
  4. Неизменяемые типы
  5. Передача по ссылке или передача по значению (и все тонкости ссылок на объекты, передаваемых по значению)
  6. Несколько неприятных примеров, которые дают неожиданные результаты, если вы не понимаете пункты 1–5.
Это было полезно?

Решение

Один из способов, который я слышал, это использовать мобильный телефон или рацию. Вы (инструктор) держите один конец и объявляете, что вы - экземпляр объекта. Вы остаетесь в одном месте (то есть в куче), в то время как студенты передают другой конец (который находится на громкой связи, если это мобильный телефон) вокруг классной комнаты.

Они могут взаимодействовать с вами через " ссылку " они имеют к вам, но на самом деле они не имеют "вы" в их владении.

Другие советы

Мне нравится аналогия с URL, которая описывает различия между типами Reference и Value. Вы можете передавать URL как ссылку на некоторый контент. Вы можете изменить этот URL без изменения этого содержимого. Вы также можете получить доступ к контенту через URL, чтобы, возможно, изменить его.

Это полезная ссылка:

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

Попробуйте объяснить ссылки с помощью цифры, поскольку чистый текст иногда не доходит до большинства людей.Многие ресурсы и книги по этой теме пытаются объяснить с помощью цифр, поскольку трудно связать распределение только посредством устного общения (для большинства людей это в основном проблема концентрации внимания).

По крайней мере, попытайтесь указать, как объекты связаны друг с другом, простым примером будет простая ссылка.

Данный:

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

class B {
   int mine = 1;
}

При создании экземпляра класса A как объект a из некоторого контекста следующий рисунок проиллюстрирует, как все это будет выглядеть в куче.Цель иллюстрации — показать, как различные объекты связаны друг с другом, и создать мысленную модель того, как работает куча.

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

Также попытайтесь объяснить разницу между распределением кучи и стека.Вызов метода с параметрами.Простой пример будет примерно таким:

Учитывая следующий метод:

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

При звонке doSomething и позволить этому сделать это, в конце концов doSomethingстек будет выглядеть примерно так, как показано ниже.Точка, показывающая, что объекты не находятся непосредственно внутри стека, а просто ссылаются на объект в куче, а объекты передаются через ссылки.

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

Другим наглядным примером может быть иллюстрация массива, который является объектом, а многомерный массив содержит массив массивов.

Я нашел эту статью очень полезной для объяснение передачи параметров в C #. Статья также хорошо объясняет общие значения и ссылочные типы.

Это скорее визуальное представление, которое мне очень помогло.

Рисунки и диаграммы.

Люди формируют мысленные образы понятий, которые они изучают, и хорошее начало - это визуальное представление ссылок и их отношение к связанным с ними объектам . Аналогично, визуализация объекта как содержащего член переменные (который включает в себя ссылки на другие объекты) и член методы , как UML-диаграммы, очень полезна.

Позже вы можете вникнуть в детали того, как на самом деле реализованы ссылки и примитивные типы, если вы чувствуете необходимость в этом. Но затяните эти обсуждения как можно дольше, поскольку люди могут увязнуть в попытках связать абстрактные понятия с деталями репрезентации, что отвлекает от изучения абстрактных понятий.

Когда я изучал VB6, ссылки на самом деле меня немного смутили. Затем я попытался изучить C ++, и после работы с указателями ссылки имели для меня смысл. Мне было легче понять это с точки зрения того, что происходит на самом деле, чем понять это с точки зрения оо-концепций. Может быть, вы можете перейти к уроку «под капюшоном» в своем уроке.

Я бы посоветовал свести к минимуму использование простого термина "ссылка" в целом, поскольку он может использоваться в .net для ссылки на две совершенно разные вещи: содержимое мест хранения классов и параметры, передаваемые с помощью "ref" Классификатор. Используйте термин «ссылка на объект» для первого и & ref; параметр ref " для последнего.

При описании «ссылки на объект» Я бы предложил использовать термин «идентификатор объекта». У идентификаторов объектов есть несколько вещей, которые отличают их от «адресов»:

<Ол>
  • Нельзя делать много вещей с помощью идентификаторов объектов. Можно проверить, является ли один пустым, проверить, равны ли два из них, скопировать один в хранилище подходящего типа или найти объект, на который ссылается один, и попросить его сделать что-нибудь. Большинство запросов на выполнение чего-либо со значением или переменной типа класса на самом деле являются запросами на выполнение чего-либо с указанным объектом. Обратите внимание, что нельзя манипулировать идентификатором одного объекта таким образом, чтобы получить идентификатор другого, как это можно сделать с адресами.
  • Хотя система должна иметь средства для преобразования идентификаторов объектов в адреса, нет никаких гарантий, что она будет использовать какие-либо конкретные средства для этого. Также нет никакой гарантии, что битовый шаблон, связанный с любым идентификатором объекта, не будет самопроизвольно изменяться; все, что гарантировано, это то, что если битовый шаблон изменяется, новый шаблон будет ссылаться на тот же объект, что и старый.
  • Система отслеживает каждое место, где хранятся идентификаторы объектов. Пока существует любая копия идентификатора объекта, этот идентификатор объекта никогда не будет ссылаться ни на что, кроме экземпляра объекта, для которого он был создан. В отличие от этого, в общем, системы, которые используют адреса для вещей, не отслеживают каждое место, где адрес может быть скопирован. Возможно, что объект может перестать существовать, пока у кого-то еще есть копия его адреса, и какой-то новый объект может быть создан с тем же адресом.
  • Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top