Этот ответ касается только части .NET вашего вопроса
Какие переменные должны быть расположены вручную в .NET / Java?Я знаю, что SqlConnection всегда следует либо удалять вручную, либо использовать в блоке using {}.Это правильно?Какие еще виды переменных должны быть расположены?
В .NET все объекты, которые реализуют IDisposable
, должны быть расположены явно (или использоваться в блоке using
).
Я где-то читал, что неуправляемый код должен быть удален вручную.Это правильно?Что такое неуправляемый код и как узнать, является ли переменная управляемой или неуправляемой?
Вы, вероятно, имеете в виду неуправляемые ресурсы, так как код не может быть утилизирован ... Все классы, которые используют неуправляемые ресурсы (память, выделенная не в управляемой куче, дескрипторы win32 ...) должны реализовывать IDisposable
и должны быть удалены явно, поскольку они не управляются сборщиком мусора.
Наконец, как мне это сделать?распоряжаться переменными?Я знаю, что метод Dispose () на самом деле не располагает переменной.Так что же делает Dispose ()?Должен ли я установить их в null ()?По какой логике работает сборщик мусора?
Я не уверен, что понимаю ваш вопрос ... вы не располагаете переменной, она управляется сборщиком мусора.Вся управляемая память автоматически освобождается, когда она больше не используется (т.е. она недоступна для кода, потому что на нее не осталось ссылок).Метод IDisposable.Dispose
предназначен только для ресурсов, которые не управляются GC.
РЕДАКТИРОВАТЬ: в качестве примечания я хотел бы добавить, что IDisposable
- это в основном предназначен для очистки неуправляемых ресурсов, но также часто используется для выполнения других действий по очистке и обеспечения целостности состояния или данных.Например, IDbTransaction
реализует IDisposable
для отката транзакции, если перед выполнением транзакции возникает исключение:
using (var trx = connection.BeginTransaction())
{
// Do some work in the transaction
...
// Commit
trx.Commit();
} // the transaction is implicitly rolled back when Dispose is called