CA2000, передающий ссылку на объект для базирования конструктора в C#

Я получаю предупреждение, когда я выполняю некоторый код через утилиту Code Analysis Visual Studio, которая я не уверен, как решить. Возможно, кто-то здесь столкнулся с подобной проблемой, разрешил его и готов совместно использовать их понимание.

Я программирую пользовательски нарисованную ячейку, используемую в управлении DataGridView. Код напоминает:

public class DataGridViewMyCustomColumn : DataGridViewColumn
{
    public DataGridViewMyCustomColumn() : base(new DataGridViewMyCustomCell())
    {
    }

Это генерирует соблюдающее предупреждение:

CA2000: Microsoft. Надежность: В методе 'DataGridViewMyCustomColumn. DataGridViewMyCustomColumn ()' называют Систему. IDisposable. Расположите на объектном 'новом DataGridViewMyCustomCell ()', прежде чем все ссылки на него будут вне объема.

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

Примеры, которые я видел в Интернете, предлагают, чтобы блок использования, чтобы определить объем времени жизни объекта и иметь систему автоматически расположил его, но основа не распознана при перемещении в тело конструктора, таким образом, я не могу записать блок использования вокруг этого..., который я не уверен, что хотел бы сделать так или иначе, с тех пор не будет это давать времени выполнения команду освобождать объект, который мог все еще использоваться позже в базовом классе?

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

10
задан brickner 18 May 2010 в 14:08
поделиться

1 ответ

Если вы используете Visual Studio 2010, то CA2000 полностью сломан. Он также может быть сломан в других версиях FxCop (он же анализ кода), но VS2010 - единственный, за который я могу поручиться. Наша кодовая база дает ПРЕДУПРЕЖДЕНИЯ CA2000 для такого кода...

internal static class ConnectionManager 
{
    public static SqlConnection CreateConnection()
    {
         return new SqlConnection("our connection string");
    }
}

... указывая, что подключение не удаляется до того, как оно выйдет за рамки метода. Ну, да, это правда, но это не выходит за рамки для приложения, поскольку оно возвращается вызывающему абоненту - в этом весь смысл метода! Точно так же аргумент конструктора не выходит за рамки области, а передается базовому классу, поэтому это ложное срабатывание правила, а не фактическая проблема.

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

18
ответ дан 3 December 2019 в 20:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: