Я надеюсь, что правильно знаю свои факты, если не поправлю меня.Почему вызов CLR Dispose автоматически
1) Вы используете Dispose для очистки неуправляемых ресурсов, что означает отсутствие сбора мусора для них.
2) Значение типа сохраняются в стеке, ссылочные типы, хранятся в куче и указатели ссылаться на типы хранятся в стеке (на самом деле не уверен насчет этого, но я думаю, что это правильно)
3) Финилеры вызывают сборщик мусора.
4) Сбор мусора вызывается CLR, а не пользователем (хотя он и может) для ссылочных типов, но типы значений уничтожаются (извините не удалось найти лучшего слова), когда они выходят за рамки
Я знаю об операторе using и способе работы, но я думаю, что было бы намного проще, если бы CLR вызывал Dispose для пользователя.
Итак, мой вопрос: «Если указатели на ссылочные типы хранятся в стеке, компилятор и среда CLR знают, когда объект выходит из области действия. Почему компилятор не генерирует какой-то IL-код, который вызывает Dispose, или почему CLR не делает этого, как это делают для финилеров и деструкторов ».
Извините, если мой вопрос не ясен, я с удовольствием обновляю его с любой другой информацией, в которой вы нуждаетесь. Спасибо.
'Dispose' - это просто программирование _pattern_, которое хорошо поддерживается языком. Объекты не располагаются автоматически, так как целью было дать разработчику возможность распоряжаться ими явным и детерминированным образом. Если у вас возникли проблемы с этим, я предлагаю использовать инструкцию '' using' (http://msdn.microsoft.com/en-us/library/yh598w02.aspx). «Типы значений, хранящиеся в стеке» - это заблуждение и упрощение, реальность - [бит более тонкий] (http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack -is-an-implementation-detail.aspx) –
Обязательная литература относительно правильного способа реализации IDisposable: http://stackoverflow.com/a/538238/1288449 –