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