Winforms: безопасно ли удалить код в автоматически создан метод Dispose (), созданный Visual Studio для Windows Forms - PullRequest
4 голосов
/ 20 декабря 2008

Фон

В Visual Studio 2008 Создайте новое приложение Windows Forms, это создаст каркасный проект с классом «Form1». VS2008 автоматически создает метод Dispose ().

    /// <summary>
    /// Clean up any resources being used.
    /// </summary>
    /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param>
    protected override void Dispose(bool disposing)
    {
        if (disposing && (components != null))
        {
            components.Dispose();
        }
        base.Dispose(disposing);
    }

Я забрел в офис коллеги (старший разработчик) - отличный парень, умный, хорошие дизайнерские навыки для чата - но я заметил, что он печатал - когда он перемещался по базе кода, он удалил этот раздел методов Dispose () VS2008, созданный для форм.

        if (disposing && (components != null))
        {
            components.Dispose();
        }

Итак, я спросил его, почему, и он сказал, что нет необходимости держать это в себе.

Вопросы

  • Безопасно ли удалять этот код?
  • Каковы плюсы / минусы оставить или удалить это?

Ответы [ 2 ]

7 голосов
/ 20 декабря 2008

Нет, удалить этот код небезопасно. Несколько компонентов зависят от того, чтобы этот шаблон действовал, чтобы правильно высвобождать неуправляемые ресурсы, на которых они держатся. Если вы удалите этот код, скорее всего, ваше приложение будет работать 95% времени. Тем не менее, 5% случаев будут проявляться как утечки ресурсов, потенциальные утечки памяти, недетерминированные ошибки ... в общем, трудно отследить проблемы.

Лучший подход к работе с одноразовым ресурсом - избавиться от того момента, когда вы его больше не используете. Следование этой практике избавит вас от многих головных болей в будущем. Удаление этого кода требует прямо противоположного подхода.

Этот пост на SO содержит более подробное объяснение: Когда я должен размещать свои объекты в .NET?

5 голосов
/ 20 декабря 2008

Абсолютно не удаляйте его , если есть вероятность, что вы когда-либо используете что-то вроде System.Windows.Forms.Timer в форме. И всегда есть шанс на это.

Именно этот код будет распоряжаться таймером при закрытии формы, и если вы не утилизируете таймер, он будет продолжать работать. Я взял на себя несколько фрагментов кода, в которых были введены ошибки такого типа (до .NET 2.0 этот механизм не работал так хорошо), и возникающие в результате периодически возникающие проблемы перфорирования, вызванные таймерами, запускающимися долго после закрытия форм, которые они должны обновить может быть настоящей болью.

Нет реального преимущества в удалении этого - если никакие элементы управления не добавили себя в список компонентов, тогда компоненты. Запуск () будет тривиальным для запуска. Если элементы управления добавили в список, то это потому, что они должны быть удалены.

...