Кажется, что каждая книга .NET говорит о типах значений против ссылочных типов и указывает на то, что (часто неправильно) указывает, где хранится каждый тип - куча или стек. Обычно это в первых нескольких главах и представлено как какой-то очень важный факт.
Я полностью согласен; Я вижу это все время.
Почему в книгах .NET говорится о распределении стека и кучи памяти?
Одна из причин в том, что многие люди пришли на C # (или другие языки .NET) из C или C ++ фона. Поскольку эти языки не обеспечивают для вас правил срока хранения, вам необходимо знать эти правила и тщательно выполнять свою программу, чтобы следовать им.
Теперь, зная эти правила и следуя им в C, не требуется, чтобы вы понимали «кучу» и «стек». Но если вы понимаете, как работают структуры данных, то зачастую легче понять и следовать правилам.
При написании книги для начинающих для автора естественно объяснить концепции в том же порядке, в котором они их выучили. Это не обязательно порядок, который имеет смысл для пользователя. Недавно я был техническим редактором книги Скотта Дормана для начинающих на C # 4, и мне понравилось то, что Скотт выбрал довольно разумный порядок тем, вместо того, чтобы начинать с действительно сложных тем в управлении памятью.
Другая часть причины заключается в том, что некоторые страницы в документации MSDN сильно подчеркивают соображения хранения. Особенно старая документация MSDN, которая до сих пор существует. Большая часть этой документации содержит тонкие ошибки, которые никогда не были удалены, и вы должны помнить, что она была написана в определенное время в истории и для определенной аудитории.
Почему стек и куча имеют значение для начинающих разработчиков .NET?
На мой взгляд, это не так. Гораздо важнее понимать такие вещи, как:
- В чем разница в семантике копирования между ссылочным типом и типом значения?
- Как ведет себя параметр «ref int x»?
- Почему типы значений должны быть неизменными?
И так далее.
Вы распределяете вещи, и это просто работает, верно?
Это идеал.
Теперь есть ситуации, в которых это имеет значение. Сборка мусора потрясающая и относительно недорогая, но не платная. Копирование небольших структур вокруг относительно недорого, но не бесплатно. Существуют реалистичные сценарии производительности, в которых вы должны сбалансировать стоимость давления сбора и стоимость чрезмерного копирования. В этих случаях очень полезно иметь четкое представление о размере, расположении и фактическом сроке службы всей соответствующей памяти.
Точно так же существуют реалистичные сценарии взаимодействия, в которых необходимо знать, что находится в стеке, а что в куче, и что может перемещать сборщик мусора. Вот почему в C # есть такие функции, как «fixed», «stackalloc» и так далее.
Но это все продвинутые сценарии. В идеале начинающему программисту не нужно беспокоиться ни об этом.