草庐IT

idisposable

全部标签

c# - IDisposable 的显式实现

虽然在SO上可以找到很多关于IDisposable的问答,但我还没有找到答案:我通常遵循的做法是,当我的一个类拥有一个IDisposable对象时,它也会实现IDisposable并在拥有的对象上调用Dispose目的。但是最近我遇到了一个显式实现了IDisposable的类,从而阻止我直接调用Dispose强制我强制转换它,我觉得这很烦人而且没有必要。那么问题来了:为什么以及何时要使用IDisposable的显式接口(interface)实现?我知道显式实现接口(interface)有非常好的和正当的理由,但关于IDisposable的原因对我来说不是很清楚。

c# - IDisposable 在方法中创建并返回

我很高兴编写了一个运行良好且在运行时不会出现任何异常的项目。所以我决定运行静态代码分析工具(我使用的是VisualStudio2010)。结果发现违反了规则CA2000,消息如下:警告-CA2000:Microsoft.Reliability:在方法“Bar.getDefaultFoo()”中,在对对象“newFoo()”的所有引用超出范围之前调用System.IDisposable.Dispose。引用的代码是这样的:privatestaticIFoogetDefaultFoo(){return(Baz.canIDoIt())?newFoo():null;}我自己想:也许条件表达式破

c# - 应该级联应用 IDisposable 吗?

这是一个相当基本的问题,但我仍在努力解决这个问题。IDisposable被实现,当你想让一个对象的用户在对象最终被垃圾收集之前释放底层资源(例如套接字等)。当我有一个包含DbConnection(实现IDisposable)的类时,我的类是否也需要实现IDisposable并链接调用到DbConnection或它拥有的任何其他IDisposable对象?否则,DbConnections资源只会在我的类被垃圾回收时释放,从而丢弃它对连接的引用,GC将最终确定DbConnection。 最佳答案 是的,如果您控制一次性对象,您总是实现I

c# - 实现 IDisposable - 一次性字段与一次性属性

我在我当前的一个项目上运行VS2013的代码分析,遇到了“CA1001:拥有一次性字段的类型应该是一次性的。”生成警告的一个简单示例(假设DisposableClass实现了IDisposable)是:classHasDisposableClassField{privateDisposableClassdisposableClass;}但是,将字段变量转换为属性不再生成警告,即使该属性将由类实例化也是如此:classHasDisposableClassProperty{privateDisposableClassdisposableClass{get;set;}publicHasDis

c# - 从方法返回一次性对象时出现 CA2000

我有一个工厂方法可以构建实现IDisposable的对象。最终是调用者管理所创建对象的生命周期。这个设计触发了一堆CA2000errors.我的设计中是否存在根本性错误,是否需要重构,或者只是对静态代码分析警告过于兴奋?工厂方法publicstaticDisposableTypeBuildTheDisposableType(stringparam1,intparam2){vartheDisposable=newDisposableType();//DosomeworktosetuptheDisposablereturntheDisposable}来电者using(vardt=Facto

c# - 为什么处置后的对象在使用它时不会抛出异常?

在处置对象上调用方法是否合法?如果是,为什么?在下面的演示程序中,我有一个一次性类A(它实现了IDisposable接口(interface))。据我所知,如果我将一次性对象传递给using()构造,然后在右括号处自动调用Dispose()方法:Aa=newA();using(a){//...}//如果正确,请解释这个程序的输出:publicclassA:IDisposable{inti=100;publicvoidDispose(){Console.WriteLine("Dispose()called");}publicvoidf(){Console.WriteLine("{0}",

c# - 调用 Dispose() 与对象超出范围/方法完成时的对比

我有一个方法,里面有一个try/catch/finalyblock。在tryblock中,我声明SqlDataReader如下:SqlDataReaderaReader=null;aReader=aCommand.ExecuteReader();在finallyblock中,手动处理的对象是那些在类级别设置的对象。那么实现IDisposable的方法中的对象,比如上面的SqlDataReader,它们会被自动释放吗?Close()在while循环执行后调用aReader以获取阅读器的内容(应该是Dispose(),因为调用关闭())。如果没有调用Close(),该对象是否会在方法完成或

c# - IDisposable 实现 - 'if (disposing)' 中应该包含什么

我一直在修复winforms应用程序中的一些内存泄漏问题,并注意到一些未明确处理的一次性对象(开发人员尚未调用Dispose方法)。Finalize方法的实现也无济于事,因为它没有进入if(disposing)子句。所有的静态事件注销和集合清除都放在了if(disposing)子句中。如果对象是一次性的,最好的做法是调用Dispose,但不幸的是,这种情况有时会发生如果有非托管对象、静态事件处理程序和一些托管集合需要在处置时清除。if(disposing)子句如何决定什么进什么出。Disposemethod.//Dispose(booldisposing)executesintwodi

c# - 具有终结器但不是 IDisposable 的单例

这是我从“CLRviaC#”、“EffectiveC#”和其他资源中对IDisposable和终结器的理解:IDisposable用于确定性地清理托管和非托管资源。负责非托管资源(例如文件句柄)的类应实现IDisposable并提供终结器以保证即使客户端代码未在实例上调用Dispose()也能清理它们。只负责托管资源的类不应该实现终结器。如果您有终结器,则必须实现IDisposable(这允许客户端代码做正确的事情并调用Dispose(),而终结器可防止在忘记时泄漏资源)。虽然我理解并同意上述所有内容的原因,但在一种情况下我认为打破这些规则是有意义的:负责非托管资源的单例类(例如提供单

c# - 在 IObservable<T> 接口(interface)中返回 IDisposable 的目的是什么?

我正在阅读HeadFirstDesignPatterns一书,并尽力将代码从他们的Java转换为C#。在这本书讨论了观察者模式之后,它提到Java具有内置的类/接口(interface),.NET4也是如此。所以我开始研究如何正确使用它,除了Subscribe()方法外,我已经弄明白了大部分内容。如果您查看MSDNArticle当您尝试订阅IObserver时,该方法返回一个IDisposable。为什么那是必要的?为什么不只实现一个基于方法参数取消订阅IObserver的方法呢?IresearchedthereasontouseanIDisposableinterface.我也读过这