当我运行代码分析工具时,我得到以下信息:
警告1 CA2000 : Microsoft.Reliability :在方法'Class1.test.testMethod()‘中,对象'dt’并非沿所有异常路径被释放。在所有对对象'dt‘的引用超出作用域之前,在其上调用System.IDisposable.Dispose。如何解决警告??
public void testMethod()
{
DataTable dt = new DataTable();
DataTable dt1= new DataTable();
try
{
if (dt.Rows.Count == 0)
{
dt1.Merge(dt);
}
}
catch
{
throw;
}
finally
{
if (dt != null) dt.Dispose();
if (dt1 != null) dt1.Dispose();
}
}发布于 2013-05-20 11:11:40
不太清楚为什么会出现这个错误,但是您可以在方法中尝试using语句块,看看错误是否消失。试一试:
public void testMethod()
{
using (DataTable dt = new DataTable())
using (DataView dv = new DataView(dt))
{
//your work
}
}发布于 2013-05-20 11:12:57
来自在失去作用域之前处理对象
如果在所有对可丢弃对象的引用超出作用域之前都未显式地释放该对象,则在垃圾收集器运行对象的终结器时,该对象将在某个不确定的时间被释放。因为可能会发生异常事件,从而阻止对象的终结器运行,因此应该显式地释放对象。 若要修复违反此规则的问题,请在对象的所有引用超出作用域之前对其调用
System.IDisposable.Dispose。 请注意,您可以使用using语句(在Visual中使用)包装实现IDisposable的对象。以这种方式包装的对象将在using块结束时自动释放。
using (DataTable dt = new DataTable())
using (DataView dv = new DataView(dt))
{
}发布于 2013-05-20 11:20:19
在代码的第7行中,您已经创建了一个没有使用的虚拟DataTable。编译器正在抱怨那个DataTable和DataView对象。像下面这样修改代码,它就能工作了。
public class Class1
{
public class test
{
public void testMethod()
{
DataTable dt = null;
DataView dv = null;
try
{
// dt must be assigned a value only within the try block
dt = new DataTable(dt);
dv = new DataView(dt);
}
catch
{ }
finally
{
if (dt != null) dt.Dispose();
if (dv != null) dv.Dispose();
}
}
}
}更新
如果您同时处理dt和dv,您将得到CA2202错误。这是因为dt被释放了两次。一次在释放dt时,一次在处理dv时。为了避免这种情况,必须在try/catch块的末尾将null分配给dt。
try
{
dt = new DataTable(dt);
dv = new DataView(dt);
dt=null;
}https://stackoverflow.com/questions/16648158
复制相似问题