C# CA2000 Утилизировать объект, прежде чем потерять прицел

Это мой код, он дает мне CA2000 для "новых DataTable()..." и "новых DataColumn()..."

usersDS.Tables.Add(new DataTable()
{
    TableName = "Users",
    Columns = { new DataColumn() { ColumnName = "Handle", DataType = typeof(string) }, new DataColumn() { ColumnName = "Nickname" ,DataType = typeof(string) } }
});

Можно ли исправить без объявления переменных?

1 ответ

Решение

Это почти дубликат инструкции Как исправить предупреждение компилятора C# CA2000 IDisposable при использовании глобального кэша. Может быть, это следует считать дубликатом этого. Я не уверен.

Анализ кода обоснованно жалуется на то, что теоретически возможно завершение метода без IDisposable объект утилизируется и без него безопасно хранится где-то еще. Последнее может произойти, если исключение происходит во время инициализации DataTable объект или добавление DataTable возражать против usersDS.Table объект (что бы это ни было).

Если вы можете гарантировать, что здесь не будет выброшено никаких исключений, то ИМХО совершенно нормально подавить предупреждение CA. В этом случае вы знаете больше, чем CA, и обещаете, что знаете, что делаете.

Если вы не можете дать гарантию, тогда нет... невозможно исправить предупреждение, не вводя локальные переменные, чтобы вы могли утилизировать объект в случае исключения. Например:

DataTable dataTable = null;
DataColumn dataColumn1 = null, dataColumn2 = null;

try
{
    dataColumn1 = new DataColumn() { ColumnName = "Handle", DataType = typeof(string) };
    dataColumn2 = new DataColumn() { ColumnName = "Nickname", DataType = typeof(string) };
    dataTable = new DataTable()
    {
        TableName = "Users",
        Columns = { dataColumn1, dataColumn2 }
    };
    usersDS.Tables.Add(dataTable);
}
catch
{
    if (dataTable != null)
    {
        dataTable.Dispose();
    }
    if (dataColumn1 != null)
    {
        dataColumn1.Dispose();
    }
    if (dataColumn2 != null)
    {
        dataColumn2.Dispose();
    }
    throw;
}
Другие вопросы по тегам