Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#CA2000在失去作用域之前处理对象_C#_Optimization_Analysis_Ca2000 - Fatal编程技术网

C#CA2000在失去作用域之前处理对象

C#CA2000在失去作用域之前处理对象,c#,optimization,analysis,ca2000,C#,Optimization,Analysis,Ca2000,这是我的代码,它给出了关于“newdatatable()…”和“newdatacolumn()…”的CA2000 不声明变量就可以修复吗?这几乎是的重复。也许它应该被认为是那个的复制品。我不确定 代码分析合理地抱怨说,理论上,该方法可以在不处置IDisposable对象的情况下完成,也不需要将其安全地存储在其他地方。如果在初始化DataTable对象或将DataTable对象添加到usersDS.Table对象(无论是什么)期间发生异常,则会发生后者 如果您可以保证这里不会抛出异常,那么IMHO

这是我的代码,它给出了关于“newdatatable()…”和“newdatacolumn()…”的CA2000


不声明变量就可以修复吗?

这几乎是的重复。也许它应该被认为是那个的复制品。我不确定


代码分析合理地抱怨说,理论上,该方法可以在不处置IDisposable对象的情况下完成,也不需要将其安全地存储在其他地方。如果在初始化
DataTable
对象或将
DataTable
对象添加到
usersDS.Table
对象(无论是什么)期间发生异常,则会发生后者

如果您可以保证这里不会抛出异常,那么IMHO完全可以取消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;
}

在这种情况下,代码看起来很好,我只想抑制警告。
DataTable
DataColumn
都不包含任何非托管资源。另请参见相关的:@JasonEvans及其基类所做的
DataTable
源自
MarshallByValueComponent
,它实现了
IDisposable
。对于
DataColumn
“代码分析合理地抱怨说,在理论上,该方法可以在不处理IDisposable对象的情况下完成”——这确实是可能的,但对于
Dispose()
没有任何有意义影响的任何类来说,这都不是合理的抱怨。正如评论中所指出的,即使
DataTable
DataColumn
实现了
IDisposable
,但这并没有真正起到任何作用,这些类的设计应该使它们不实现
IDisposable
。我们无法解决这个问题。不过,我们可以避免对它们的
Dispose()
方法进行无意义的调用。
DataTable
DataColumn
IDisposable
中没有任何有意义的操作,这是一个实现细节。也就是说,它不是
数据表
数据列
合同的一部分,理论上可能在未来发生变化。我倾向于将代码编写成公共契约,而不是私有实现,因此,不管您对私有实现的详细信息了解多少,最好直接处理
IDisposable
对象。一般来说,这是有道理的,但在这种情况下,就不那么有道理了。不仅如此,您的答案建立在这样一个假设之上,即在数据表和列添加到数据集中后,不处理它们是可以的,这可能是因为处理数据集也会处理包含的表和列,但数据集不会这样做,其文档也不会声称这样做。根据你自己的逻辑,你自己建议的方法是不对的。真的吗?你想就此大吵一架吗?即使在这里的示例中甚至没有“数据集”?即使
System.Data.DataSet
类型是作为包含
DataTable
DataColumn
的同一库的一部分编写的?也就是说,如果对
DataTable
和/或
DataColumn
进行了更改,那么作者也可以更新相同库中的代码以进行匹配,这对于用户代码来说是不正确的。真正地哦……就像我说的:你的里程可能会有所不同。欢迎您发表意见。我假设
usersDS
被命名为
usersDS
,因为它是“用户”
DataSet
。如果这个假设不正确,我很抱歉。顺便说一句,你可能想投票表决的一些答案上(再次):排名靠前的答案不同意你,但其他一些答案会。
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;
}