首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CA2000 : Microsoft.Reliability :在对对象'dt‘的所有引用超出作用域之前调用它的System.IDisposable.Dispose

CA2000 : Microsoft.Reliability :在对对象'dt‘的所有引用超出作用域之前调用它的System.IDisposable.Dispose
EN

Stack Overflow用户
提问于 2013-05-20 11:07:50
回答 8查看 7.1K关注 0票数 7

当我运行代码分析工具时,我得到以下信息:

警告1 CA2000 : Microsoft.Reliability :在方法'Class1.test.testMethod()‘中,对象'dt’并非沿所有异常路径被释放。在所有对对象'dt‘的引用超出作用域之前,在其上调用System.IDisposable.Dispose。如何解决警告??

代码语言:javascript
复制
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();
      }
}
EN

回答 8

Stack Overflow用户

发布于 2013-05-20 11:11:40

不太清楚为什么会出现这个错误,但是您可以在方法中尝试using语句块,看看错误是否消失。试一试:

代码语言:javascript
复制
public void testMethod()
{
    using (DataTable dt = new DataTable())
    using (DataView dv = new DataView(dt))
    {
        //your work
    }
}
票数 5
EN

Stack Overflow用户

发布于 2013-05-20 11:12:57

来自在失去作用域之前处理对象

如果在所有对可丢弃对象的引用超出作用域之前都未显式地释放该对象,则在垃圾收集器运行对象的终结器时,该对象将在某个不确定的时间被释放。因为可能会发生异常事件,从而阻止对象的终结器运行,因此应该显式地释放对象。 若要修复违反此规则的问题,请在对象的所有引用超出作用域之前对其调用System.IDisposable.Dispose。 请注意,您可以使用using语句(在Visual中使用)包装实现IDisposable的对象。以这种方式包装的对象将在using块结束时自动释放。

代码语言:javascript
复制
using (DataTable dt = new DataTable())
using (DataView dv = new DataView(dt))
{

}
票数 2
EN

Stack Overflow用户

发布于 2013-05-20 11:20:19

在代码的第7行中,您已经创建了一个没有使用的虚拟DataTable。编译器正在抱怨那个DataTable和DataView对象。像下面这样修改代码,它就能工作了。

代码语言:javascript
复制
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();

         }
        }
    }
}

更新

如果您同时处理dtdv,您将得到CA2202错误。这是因为dt被释放了两次。一次在释放dt时,一次在处理dv时。为了避免这种情况,必须在try/catch块的末尾将null分配给dt

代码语言:javascript
复制
    try
    {
        dt = new DataTable(dt);
        dv = new DataView(dt);
        dt=null;
     }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16648158

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档