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