Схоже, що кожна .NET книга розповідає про типи значень проти посилальних типів і робить його точкою (часто неправильно) стану, де зберігається кожен тип - купа або стек. Зазвичай це в перших кількох главах і подається як якийсь важливий факт.
Я згоден повністю; Я це бачу весь час.
Чому книги .NET говорять про розподіл стека проти купи пам'яті?
Однією з причин є те, що багато людей прийшли до C # (або інших мов .NET) із C або C ++. Оскільки ці мови не застосовують для вас правил щодо тривалості зберігання, ви зобов'язані знати ці правила та уважно реалізовувати свою програму, щоб дотримуватися їх.
Тепер, якщо знати ці правила та виконувати їх у C, не потрібно, щоб ви розуміли "купу" та "стек". Але якщо ви розумієте, як працюють структури даних, то часто простіше зрозуміти та слідувати правилам.
Під час написання книги для початківців автор закономірно пояснює поняття в тому ж порядку, в якому їх вивчив. Це не обов’язково порядок, який має сенс для користувача. Нещодавно я був технічним редактором книги для початківців Скотта Дормана C # 4, і одна з речей, що мені сподобалась у тому, що Скотт вибрав досить розумне замовлення для тем, а не починаючи з того, що насправді є досить передовими темами управління пам’яттю.
Інша частина причини полягає в тому, що деякі сторінки документації MSDN сильно підкреслюють міркування щодо зберігання. Особливо старіша документація MSDN, яка все ще висить з перших днів. Значна частина цієї документації має тонкі помилки, які ніколи не були виправлені, і ви повинні пам’ятати, що вона була написана в певний час в історії та для певної аудиторії.
Чому стек проти купи навіть має значення для початківців розробників .NET?
На мою думку, це не так. Що важливіше зрозуміти - це такі речі:
- Чим відрізняється семантика копії між типом посилання та типом значення?
- Як поводиться параметр "ref int x"?
- Чому типи значення повинні бути незмінними?
І так далі.
Ви виділяєте речі, і це просто працює, правда?
Це ідеал.
Зараз є ситуації, в яких це має значення. Збір сміття є приголомшливим та відносно недорогим, але він не безкоштовний. Копіювання невеликих конструкцій навколо коштує порівняно недорого, але не є безкоштовним. Існують реалістичні сценарії продуктивності, за яких вам доведеться врівноважувати витрати на збір тиску проти витрат на надмірне копіювання. У цих випадках дуже корисно добре розуміти розмір, розташування та фактичний термін служби всієї відповідної пам'яті.
Аналогічно, існують реалістичні сценарії взаємодії, в яких потрібно знати, що знаходиться на стеці, а що на купі, і що смітник може переміщатися. Ось чому C # має такі функції, як "фіксований", "stackalloc" тощо.
Але це все прогресивні сценарії. В ідеалі програміст-початківець не повинен турбуватися ні про що з цього матеріалу.