Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.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
.net 是否有任何理由处置表适配器?_.net_Dataset_Strongly Typed Dataset_Tableadapter - Fatal编程技术网

.net 是否有任何理由处置表适配器?

.net 是否有任何理由处置表适配器?,.net,dataset,strongly-typed-dataset,tableadapter,.net,Dataset,Strongly Typed Dataset,Tableadapter,在许多情况下,处理不同类型的数据对象时,重要的是要处理它们,以确保它们不会使数据库连接保持打开状态。但是,表适配器似乎不易受到此问题的影响,因为它们是基于断开连接的数据的原则构建的。我的印象是,表适配器总是在原子填充或更新方法完成后关闭其连接,即使存在异常。这是正确的吗 另一方面,表适配器确实实现了IDisposable,所以一定有一些非托管资源需要清理,对吗?或者这只是一个仪式,人们可以写: using(var a = new MyTableTableAdapter()) { a.Fi

在许多情况下,处理不同类型的数据对象时,重要的是要处理它们,以确保它们不会使数据库连接保持打开状态。但是,表适配器似乎不易受到此问题的影响,因为它们是基于断开连接的数据的原则构建的。我的印象是,表适配器总是在原子填充或更新方法完成后关闭其连接,即使存在异常。这是正确的吗

另一方面,表适配器确实实现了IDisposable,所以一定有一些非托管资源需要清理,对吗?或者这只是一个仪式,人们可以写:

using(var a = new MyTableTableAdapter())
{
    a.Fill(ds.MyTable);
}

而且不必考虑这个主题?

如果它实现了IDisposable,那么它当前持有要处置的资源,或者将来可能持有要处置的资源。如果是一次性的,你应该把它处理掉。你不需要理解它的内在,只需要理解它的合同并尊重它。通常,人们不会在仪式之外做事——“使用”是一种很酷的语法糖,但还不足以在没有资源可处理的类周围撒上IDisposable:)

此外,IDisposable并不一定意味着“非托管”资源。这意味着有些资源(如文件句柄、网络连接等)不是垃圾收集的对象(内存)。区别在于清理未收集的东西,而不是未管理的东西通常这些资源中的许多都是由非托管操作系统资源支持的

编辑:


例如,假设我创建了一个完全托管的对象,该对象根据需要从池(缓存)中检索一些其他对象,当您使用完它后,我希望它将这些对象放回共享池(未释放-向池中添加内容的显式调用。此处没有未管理的内容,但我可以按需从池中提取对象,在dispose中,我可以将它们放回(pool.add)供其他人使用。消费者只需“使用”我的对象,并且知道它将在释放时清理。需要显式的释放,因为我们不应该等待finalize(它可能会在以后发生,也可能根本不会发生)–

做到这一点,不要去想它。这基本上不会影响您的性能,也不会让您担心对框架的二次猜测!文件句柄和网络连接不是处于非托管状态吗?这里引用了最新文档中的一句话:“此接口的主要用途是释放非托管资源。”看到创建接口的原因是为了“清理”,因为垃圾收集是为了收集对象/内存。正如我所说的,这些对象通常由操作系统资源支持,这些资源最终是非托管的——但要知道每个人都在说“主”和“经常”。最后一个通牒是,在您完成后处理—清理。例如,假设我创建了一个完全托管的对象,该对象从池中检索了一些其他对象,当您完成使用后,我希望它将这些对象放回共享池中(未释放-向池中添加内容的显式调用。此处没有未管理的内容,但我可以按需从池中提取对象,在dispose中,我可以将它们放回(pool.add)供其他人使用。消费者只需“使用”我的对象,并且知道它在释放时会清理干净。需要显式的释放,因为我们不应该等待finalize(它可能会在以后发生,也可能根本不会发生)我不能反对“如果它实现了,你必须调用它”规则。我想这个问题实际上是对SqlDataAdapter接口的批评,因此可能是离题的。