C# CA2000 在丢失作用域之前释放对象

本文关键字:释放 对象 作用域 CA2000 | 更新日期: 2023-09-27 18:31:26

这是我的代码,它给了我 CA2000 关于"new DataTable()..."和"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) } }
});

是否可以在不声明变量的情况下修复?

C# CA2000 在丢失作用域之前释放对象

这几乎是使用全局缓存时如何修复 CA2000 IDisposable C# 编译器警告的副本。也许它应该被认为是那个的重复。我不确定。

代码分析合理地抱怨说,从理论上讲,该方法可以在不释放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;
}