Этот быстрый совет стал длинным ответом. Сожалею.
Как отметил Тайлер в своем хорошем ответе, вызов Dispose()- отличная практика программирования. Это связано с тем, что этот метод должен объединять все необходимое освобождение ресурсов, чтобы не было ненужных открытых ресурсов. Например, если вы записали какой-то текст в файл и не смогли закрыть файл (освободить ресурс), он останется открытым, и никто больше не сможет писать в него, пока GC не придет и не сделает то, что вы должны иметь. сделано.
Теперь, в некоторых случаях будут «финализировать» методы, более специфичные для класса, с которым вы имеете дело, например StreamWriter.Close(), который переопределяет TextWriter.Close(). На самом деле они обычно больше подходят для ситуации: Close()например, StreamWriter сбрасывает поток и базовый кодер перед Dispose()созданием объекта! Прохладно!
Однако, просматривая MSDN, вы обнаружите, что даже Microsoft иногда сбивает с толку множество приближенных и сторонников. На этой веб-странице , например, в некоторых примерах Close()вызывается перед неявным Dispose()(см. Оператор using, если вы не понимаете, почему он неявный), и в одном из них они не беспокоятся. С чего бы это? Я тоже был озадачен.
Причина, по которой я решил (и я подчеркиваю, что это оригинальное исследование, и я, безусловно, могу потерять репутацию, если я ошибаюсь), заключается в том, что он Close()может потерпеть неудачу, приводя к исключению, оставляя ресурсы открытыми, но Dispose(), несомненно, освободит их . Именно поэтому всегда должен защищать в вызов (извините за каламбур).Dispose()Close()
MyResource r = new MyResource();
try {
r.Write(new Whatever());
r.Close()
finally {
r.Dispose();
}
И да, я думаю, что Microsoft воспользовалась этим примером. Возможно, эта временная метка никогда не будет сброшена в файл.
Завтра я исправляю свой старый код.
Редактировать: извините Браннон, я не могу комментировать ваш ответ, но вы уверены, что это хорошая идея, чтобы позвонить Close()в finallyблок? Я предполагаю, что исключение из этого может разрушить остальную часть блока, который, вероятно, будет содержать важный код очистки.
Ответ Браннона: отлично, просто не забывайте звонить, Close()когда это действительно необходимо (например, при работе с потоками - не очень разбирайтесь в соединениях SQL в .NET).