2011-04-07 31 views
0

我有使用SqlDataAdapter是否需要处理无法填充的DataTable?

// ... 
using (SqlDataAdapter dataAdapter = new SqlDataAdapter(command)) 
    try 
    { 
     dataAdapter.Fill(dataTable); 
    } 
    catch 
    { 
     dataTable.Dispose(); 
     dataTable = null; 
    } 

现在,我不喜欢货物邪教编程填补了DataTable的功能,所以我宁愿没有try - catch块,如果它是不必要的。是否需要Dispose a DataTable未能填满?

+0

你的问题与问题的标题有什么关系? – 2011-04-07 16:50:31

+0

@马克乙:对不起,我不小心从另一个问题上复制了标题。以防万一,我喜欢打开几个StackOverflow问题页面。 – pyon 2011-04-07 16:52:58

+1

伟大的货物崇拜大声敲门。 DataTable不实现Dispose()。没有意义,它只是一包字节。它从MarshalByValueComponent继承它。当你使用数据设计器,即“组件”部分时,它只会做一些半有趣的事(不是真的)。如果你没有,那么Dispose()就什么也不做。当然,我无法将其作为答案发布。 – 2011-04-07 17:07:14

回答

1

不,不需要调用Dispose。这样做将不会释放已用于该对象的内存,并且即使您不拨打Dispose,GC也会在稍后时间检索它。你可以阅读更多关于这个here

+0

真棒回答!如果MSDN文档包含此信息将会很好。 – pyon 2011-04-07 16:58:42

1

由于try块未能在对象上调用Dispose是没有必要的

1

如果代码创建一个特定明确具体类型的对象,它被记录为实现IDisposable.Dispose作为无糖op,那么可以安全地做,而无需直接或间接调用Dispose。如果Dispose确实没有做任何事情,那么处置或不处理都不会影响任何内容。另一方面,如果你的代码使用类似工厂方法的东西来创建一个实现IDisposable的可继承类型的对象,或者如果你的代码被赋予了这样一个对象的所有权,那么你应该处理它。即使你希望得到一个不需要Dispose的类的对象,也没有办法确定你的类不会接受一个需要Dispose的派生类型。请注意,通常,将实现IDispsoable.Dispose的类调用Dispose作为no-op将非常快;对于可能需要或可能不需要IDisposable的类来实现Dispose作为no-op,并且使类调用的用户无条件地Dispose,而不是要求类的用户测试对象是否为IDisposable,以及Dispose如果是的话。