4

This is my code, it gives me CA2000 on "new DataTable()..." and "new DataColumn()..."s

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

Is it possible to fix without declaring variables?

4

1 回答 1

7

这几乎是How to fix a CA2000 IDisposable C# compiler warning, when using a global cache的副本。也许它应该被认为是那个的副本。我不确定。

代码分析合理地抱怨说,理论上可以在没有处理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;
}
于 2014-11-22T20:36:36.670 回答