C#CA2000在丢失范围之前处置对象

Sin*_*ros 4 c# optimization analysis ca2000

这是我的代码,它给了我CA2000"new DataTable()..."和"new DataColumn()..."

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

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

Pet*_*iho 7

当使用全局缓存时,这几乎与如何修复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;
}
Run Code Online (Sandbox Code Playgroud)

  • `DataTable`和`DataColumn`在`IDisposable`中没有有意义的动作这一事实是_implementation detail_.即它不是"DataTable"或"DataColumn"合同的一部分,理论上可以在未来发生变化.我倾向于对公共合同进行编码,而不是私有实现和恕我直言,不管你对私有实现细节的了解如何,最好继续处理`IDisposable`对象.因人而异. (2认同)