Анализ кода CA2000: этот код в порядке? - PullRequest
0 голосов
/ 26 марта 2011

Посмотрите на этот код, я считаю, что он решил CA2000, но я хочу убедиться, что я ничего не пропускаю.В основном этот код загружает новый Control на основе того, что выбрано в TreeView.Это Control затем отображается и отображается / может использоваться до тех пор, пока не будет выбрано другое Node в TreeView.

private void Something(object sender, TreeViewEventArgs e)
{
    ProjectTreeNode node = (e.Node as ProjectTreeNode);

    foreach (Control c in optionsPlaceholderPanel.Controls)
        c.Dispose();

    optionsPlaceholderPanel.Controls.Clear();

    if (node != null)
    {
        //ProjectOptions inherits from Control and is therefore IDisposable
        ProjectOptions options = new ProjectOptions(node.Project);

        ShowOptionsPanel(options);
    }
}

private void ShowOptionsPanel(Control control)
{
    optionsPlaceholderPanel.Controls.Add(control);
    control.Dock = DockStyle.Fill;
}

Таким образом, в основном Control находится в области действия всегда, до нового Control загружается вместо него.Когда я это делаю, я избавляюсь от предварительно загруженного Control, так что я думаю, что в этом случае можно игнорировать CA2000.Кроме того, когда Form окончательно закрывается и удаляется optionsPlaceholderPanel, это также избавляет от дочерних элементов управления, верно?

1 Ответ

0 голосов
/ 26 марта 2011
foreach (Control c in optionsPlaceholderPanel.Controls)
    c.Dispose();

Нет, в этом коде есть ошибка.Что само по себе вызвано ошибкой в ​​классе ControlCollection.Ваш цикл foreach изменяет коллекцию Controls панели.Обычно это создает InvalidOperationException: «Коллекция была изменена, операция перечисления может не выполняться», но класс забывает это делать.

Вызов Dispose () для элемента управления удаляет его из коллекции.По сути, вы будете распоряжаться только всеми другими элементами управления.Это должно иметь побочный эффект, они остаются видимыми на панели.YMMV.Исправление:

        for (int ix = optionsPlaceholderPanel.Controls.Count - 1; ix >= 0; --ix)
            optionsPlaceholderPanel.Controls[ix].Dispose();

Или менее эффективно, хотя вы никогда не увидите разницу:

        while (optionsPlaceholderPanel.Controls.Count > 0)
             optionsPlaceholderPanel.Controls[0].Dispose();

В противном случае код в порядке, CA2000 имеет тенденцию выдавать ложные предупреждения.

...