Tag: idisposable

如果我替换PictureBox控件中的图像,我应该先处理原始图像吗? .Net Winforms

继我的问题之后,如果我更换图片框中的图像,我应该首先处理原始图像吗? 或者,这种情况怎么样: Dim bm As New Bitmap(32,32) bm = New Bitmap(32,32) bm = New Bitmap(32,32) bm = New Bitmap(32,32) bm只需要在最后处理,还是应该在每次重新创建之前处理? 谢谢大家的答案。 在我身上有一个很大的疏忽。 我知道一个控制部门负责处理它的孩子,但我没想到如果我更换它就应该处理一个旧图像。

c#静态成员是如何以及何时处置的?

我有一个包含大量静态成员的类,其中一些保留对托管和非托管对象的引用。 例如,一旦引用了Type,就会调用静态构造函数,这会导致我的类启动tasks的blockingQueue。 例如,当调用其中一个静态方法时会发生这种情况。 我实现了IDisposable,它为我提供了处理我创建的任何实例对象的方法。 但是,如果使用者不从我的类创建任何实例对象,则永远不会调用这些方法。 如何以及在何处放置代码来处理由我的类的静态部分维护的引用? 我一直认为在发布最后一个实例对象时会发生静态引用资源的处理; 这是我第一次创建一个不会创建任何实例的类。

确定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,以确保事件处理程序无线连接吗?

谁处置了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 […]

“打开连接”究竟意味着什么?

我试图向某人解释为什么数据库连接实现IDisposable,当我意识到我真的不知道“打开连接”实际意味着什么。 所以我的问题是 – 当c#打开一个连接时,它实际上做了什么? 谢谢。

为什么一个类显式实现IDisposable而不是隐式?

我使用的是FtpWebResponse类,但没有看到Dispose方法。 事实certificate ,该类实现了IDisposable,但是明确地这样做,因此在调用Dispose之前必须先将实例强​​制转换为IDisposable: // response is an instance of FtpWebResposne ((IDisposable) response).Dispose(); 为什么像这样的类的设计者会选择明确地实现IDisposable? 正如Anthony Pegram所说 ,以这种方式做事掩盖了这样一个事实,即对象应该为每次使用课程时都没有查阅文档的普通开发人员处理。

当父类也实现IDisposable时,在子类上实现IDisposable

我有一个父类和子类,都需要实现IDisposable 。 virtual (和base.Dispose() ?)调用应该在哪里发挥作用? 当我只是重写Dispose(bool disposing)调用时,我觉得很奇怪,我没有显式的Dispose()函数(只使用inheritance的)实现IDisposable ,但是还有其他的东西。 我一直在做什么(微不足道): internal class FooBase : IDisposable { Socket baseSocket; private void SendNormalShutdown() { } public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } private bool _disposed = false; protected virtual void Dispose(bool disposing) { if (!_disposed) { if (disposing) { SendNormalShutdown(); } baseSocket.Close(); } } ~FooBase() { Dispose(false); } […]

手动销毁C#对象

我对学习C#(来自Java和C ++背景)相当新,我有一个关于手动垃圾处理的问题:是否有可能手动销毁C#中的对象? 我知道IDisposable接口,但是假设我正在处理一个我没写过的类而且它没有实现它? 它不会有.Dispose()方法,因此using { }是out,而且.Finalize总是protected或private因此也不是一个选项。 (我只是想在这种情况下学习C#中可能的内容 。我想如果所有其他方法都失败了,我可以inheritance假设的ImNotDisposable类,以便它实现IDisposable。)