Tag: dispose

Dispose()用于清理托管资源?

在这个答案中,我发现, 在代码中使用Dispose / Finalize模式时,清除Finalize方法中的非托管资源和Dispose方法中的托管资源。 后来我发现这篇关于敲定和处理的好文章 ,并对它们有了清晰的认识。 本文有以下代码( 第3页 ),用于解释概念: class Test : IDisposable { private bool isDisposed = false; ~Test() { Dispose(false); } protected void Dispose(bool disposing) { if (disposing) { // Code to dispose the managed resources of the class } // Code to dispose the un-managed resources of the class isDisposed = true; […]

我是否需要在ASP.NET中部署Web服务引用?

垃圾收集器是否清理了Web服务引用,或者在调完我调用的任何方法后,是否需要在服务引用上调用dispose?

Datatable.Dispose()会从内存中删除吗?

我通过非常简单的代码进行研究,并且一直看到数据表的dispose()结果 以下是代码 DataTable dt= new Datatable(); SqlCommand Cmd = new SqlCommand(“sp_getData”,SqlCon); SqlCommand.CommandType= CommandType.StroedProcedure; SqlCon.Open(); sqlDataReader dr= cmd.ExecuteReader(); dt.Load(dr); SqlCon.Close(); grdView.DataSource =dt; dt.Dispose() // Here I dispose the table as it is no use for me & wanna memory free from this 但在处理掉数据表之后,我仍然发现它仍然显示RowCount = 10k。 Dispose()方法是不是释放内存并使对象为null? 我怎样才能使它成为null或释放这个对象占用的内存?

确定IDisposable是否应扩展接口或在实现所述接口的类上实现

如何确定是否应该使用IDisposable扩展我的一个接口或在实现我的接口的类上实现IDisposable? 我有一个不需要处理任何外部资源的接口,除了一个特定的实现。 我的选择似乎是: 1)在接口上实现IDisposable,要求所有实现都实现Dispose,即使只是一个空方法。 -要么- 2)仅在需要处理资源的类上实现IDisposable。 这将导致“使用”问题,因为我的对象是从工厂创建的,因此所有上游代码都对接口起作用。 由于接口未绑定到IDisposable,因此“使用”不会看到Dispose方法。 但是,我可以将工厂结果投射到实施中; 然而,这会使消费者意识到实现,从而破坏了接口的目的。 关于最佳实践的任何想法?

仅限受管资源的最小IDisposable implimenation

关于处理非托管资源的“标准完整” IDisposable实现有很多信息 – 但实际上这种情况非常罕见(大多数资源已经被托管类包装)。 这个问题集中在更常见的“仅限托管资源”案例的IDisposable的最小实现上。 1:下面的代码中IDisposable的mimimal实现是否正确,是否存在问题? 2:有没有理由在最小的实现中添加一个完整的标准IDisposable实现( Dispose() , Dispose(bool) , Finalizer等)? 3:在这个极小的情况下,使Dispose虚拟是否正确/明智(因为我们不提供Dispose(bool) )? 4:如果这个最小的实现被一个包含(在这种情况下是无用的)终结器的完整标准实现所取代 – 这是否会改变GC处理对象的方式? 有任何缺点吗? 5:该示例包括Timer和事件处理程序,因为这些情况特别重要,不要错过,因为未能处理它们会使对象保持活动和踢(在Timer情况下,在事件处理程序的情况下为eventSource ),直到GC轮到处理它们的时间。 还有其他这样的例子吗? class A : IDisposable { private Timer timer; public A(MyEventSource eventSource) { eventSource += Handler } private void Handler(object source, EventArgs args) { … } public virtual void Dispose() { timer.Dispose(); if (eventSource != […]

终结者和IDisposable

根据文档(MSDN: 链接 ),很明显在实现终结器时应该使用IDisposable模式。 但是,如果实现IDisposable(以便提供处理对象的确定性方法),您是否需要实现终结器?并且您没有任何非托管资源来清理? 在我看来,如果类只有托管资源,如果你不调用Dispose,那么托管资源将自动被GC清理,因此不需要实现终结器。 我错了吗? 另外,如果我使用我的Dispose方法清理事件处理程序,该怎么办? 由于Dispose不会自动被GC调用,我应该实现Finalizer,以确保事件处理程序无线连接吗?

什么时候需要处理?

如果您有以下代码: Bitmap bmp = new Bitmap ( 100, 100 ); Graphics g = Graphics.FromImage ( bmp ); Pen p = new Pen ( Color.FromArgb ( 128, Color.Blue ), 1 ); Brush b = new SolidBrush ( Color.FromArgb ( 128, Color.Blue ) ); g.FillEllipse ( b, 0, 0, 99, 99 ); g.FillRegion ( b, pictureBox1.Region ); […]

C#中的一次性单身人士

我有一个使用“静态只读T实例=新T();”的单例 图案。 但是,我遇到了T是一次性的情况,实际上需要处理以进行unit testing。 如何修改此模式以支持一次性单件? 我想要的界面是这样的: var x = Foo.Instance; var y = Foo.Instance; // x == y … x.Release(); // this causes the next Foo.Instance to return a fresh object // also, it assumes no further operations on x/y will be performed. 注意 – 模式当然必须是线程安全的。 编辑 – 出于生产代码的目的,这是一个真正的单身人士。 问题是它锁定了一些文件,因此在unit testing中我们必须处理它。 如果可能的话,我也更喜欢可以重复使用的模式。

C#USING关键字 – 何时何地不使用它?

我想知道什么时候应该而且不应该在USING块中包装东西。 根据我的理解,编译器将其转换为try / finally,最后在对象上调用Dispose()。 我总是使用围绕数据库连接和文件访问的USING,但它更多的出于习惯而不是100%的理解。 我知道你应该明确(或使用)Dispose()控制资源的对象,以确保它们立即释放,而不是在CLR感觉到它的时候释放,但这就是我理解失败的地方。 IDisposables在超出范围时是否被弃置? 当我的对象使用Dispose来整理自己时,我只需要使用USING吗? 谢谢 编辑:我知道USING关键字上还有其他一些post,但我对CLR的相关答案更感兴趣,而且内部发生了什么 安德鲁

谁处置了IDisposable公共财产?

如果我有一个实现IDisposable的SomeDisposableObject类: class SomeDisposableObject : IDisposable { public void Dispose() { // Do some important disposal work. } } 我有另一个名为AContainer类,它有一个SomeDisposableObject实例作为公共属性: class AContainer { SomeDisposableObject m_someObject = new SomeDisposableObject(); public SomeDisposableObject SomeObject { get { return m_someObject; } set { m_someObject = value; } } } 然后FxCop将坚持认为AContainer也是IDisposable 。 这很好,但我看不出如何从AContainer.Dispose()安全地调用AContainer.Dispose() ,因为另一个类可能仍然有对m_someObject实例的引用。 避免这种情况的最佳方法是什么? (假设其他代码依赖于AContainer.SomeObject总是具有非空值,因此只需将实例的创建AContainer之外就不是一种选择) 编辑 :我将扩展一些例子,因为我认为一些评论者错过了这个问题。 如果我只是在AContainer上实现一个Dispose()方法,它调用m_someObject.Dispose()然后我留下这些情况: // Example […]