Хотя у меня нет ответа, я чувствую, что стоит написать это как ответ, а не просто комментарии. Насколько я знаю, текущий ответ с наибольшим количеством голосов неверен. Согласно Гордону Хогенсону в Основах C ++ / CLI он поддерживает «синтаксический сахар или ловкость дескриптора» .... «Подводя итог, можно выделить объект, выделенный в куче , немедленно удаленный в конце блока вместо ленивого сбора мусора, и, как следствие, деструктор вызывается сразу после удаления ". шахты, р 63 Семантика стека и кучи
Программисты C ++ (предварительно умные указатели) привыкли к тому, что все, что они новые , они должны удалить . Однако, когда программист C ++ создает локальную переменную, ее не нужно помещать в кучу. Можно использовать семантику стека, и тогда объект не должен быть явно удален.
void Class::SomeMethod()
{
DbConnection connection; //No memory leak if not deleted
DbConnection leaky_connection = new DbConnection(); //on the heap will leak if not deleted
}
В C ++ / CLI это выглядит немного иначе для выделения кучи:
DbConnection^ connection = gcnew DbConnection();
Но поскольку MS знала, что программисты на C ++ используются для создания семантики стека, они допускают семантическую версию стека:
DbConnection connection;
И при условии существования:
~DbConnection()
{
//Close the connection
}
Семантическая версия стека немедленно вызовет деструктор в конце метода, где используется соединение.
Я думаю, что трудность сделать это в C # заключается в противоположности того, почему это разрешено в C ++ / CLI (и здесь я могу столкнуться с проблемами). Программисты C # привыкли позволять сборщику мусора заботиться о вещах. Они могут выделить локальный объект, вставить его в нелокальный контейнер и не беспокоиться о том, что он выйдет из области видимости в конце метода. ГК знает, что он в коллекции, и он не будет преждевременно уничтожен. C # всегда имеет дело со ссылками на объекты, и вы явно не указываете кучу против стека хранения. Реализация этой « ловкости ручки » в C #, вероятно, сломает много кода и ожиданий.
На самом деле, даже синтаксис оператора , использующий , может создать неожиданную проблему в C #. Я написал свой любимый пример этого в Когда «Уничтожение» выбрасывает ребенка с водой » некоторое время назад.